mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
Compare commits
84 commits
main
...
v0.28.0-rc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f21853bd8 | ||
|
|
b7fe462045 | ||
|
|
bf0034f694 | ||
|
|
b228b611de | ||
|
|
72b56d9fe5 | ||
|
|
fb12d00c70 | ||
|
|
1690efeb72 | ||
|
|
5c8cf9a470 | ||
|
|
d9ae2f8503 | ||
|
|
b71cd96d12 | ||
|
|
d93722a023 | ||
|
|
7d2647d59a | ||
|
|
1dff943455 | ||
|
|
ce7a180e73 | ||
|
|
ca1ad508a4 | ||
|
|
6d531e0303 | ||
|
|
e6e5d61b22 | ||
|
|
7386a5d514 | ||
|
|
4140858066 | ||
|
|
cc56bafc66 | ||
|
|
10408b46c2 | ||
|
|
e2764dcee1 | ||
|
|
5c333770ee | ||
|
|
3cba40b5c8 | ||
|
|
2b85f5abf6 | ||
|
|
a6403f27d5 | ||
|
|
d90f4400ed | ||
|
|
7575a04305 | ||
|
|
3e8f296c72 | ||
|
|
1087e020d1 | ||
|
|
e961288e89 | ||
|
|
7ec2d3f0e0 | ||
|
|
97eca26d58 | ||
|
|
2e4caf5d19 | ||
|
|
490434948d | ||
|
|
6a55830f1f | ||
|
|
bf314cbb4c | ||
|
|
d3406f4509 | ||
|
|
adb6a05ae7 | ||
|
|
e590a7cd4e | ||
|
|
8420377789 | ||
|
|
fbc1b160e1 | ||
|
|
e07aba6d37 | ||
|
|
2de2084b5b | ||
|
|
526deb30f0 | ||
|
|
1e1db43854 | ||
|
|
b08f2d1d33 | ||
|
|
d4736962ab | ||
|
|
68a7d8a03a | ||
|
|
c0d569162b | ||
|
|
6043ab248b | ||
|
|
6958a5edd0 | ||
|
|
86bcb03f6e | ||
|
|
f6a6c19132 | ||
|
|
76337efe76 | ||
|
|
93fecf3720 | ||
|
|
df8b313a74 | ||
|
|
e65e031344 | ||
|
|
83832545ae | ||
|
|
0b7323c096 | ||
|
|
d503ae6da6 | ||
|
|
48b9be5bb6 | ||
|
|
a7f6171063 | ||
|
|
8f4750db15 | ||
|
|
39a5a680d2 | ||
|
|
61af0a0c26 | ||
|
|
53c806c0c4 | ||
|
|
b5bf9fd3e2 | ||
|
|
7a72578517 | ||
|
|
1db46eaf9b | ||
|
|
819a875fcc | ||
|
|
1b50d731fc | ||
|
|
621aa9d7a9 | ||
|
|
6a6712799c | ||
|
|
a7f0678dad | ||
|
|
4fca5ed21c | ||
|
|
abc83a7dfb | ||
|
|
52e6d08e79 | ||
|
|
46e9585bce | ||
|
|
8d05176032 | ||
|
|
41dac8bb20 | ||
|
|
9dee4e4617 | ||
|
|
981b3b898e | ||
|
|
d3239591b8 |
186 changed files with 22397 additions and 403 deletions
|
|
@ -138,6 +138,10 @@ renderer.backend.gl.enableframebufferinvalidating = false
|
|||
|
||||
renderer.backend.vulkan.disabledescriptorindexing = false
|
||||
renderer.backend.vulkan.deviceindexoverride = -1
|
||||
renderer.backend.vulkan.destroyoldswapchainbefore = false
|
||||
|
||||
; In case index override isn't enough we might choose a device automatically.
|
||||
renderer.backend.vulkan.choosebestdevice = false
|
||||
|
||||
renderer.backend.vulkan.debugbarrierafterframebufferpass = false
|
||||
renderer.backend.vulkan.debugwaitidlebeforeacquire = false
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant file="others/waypoints/base.xml" frequency="1" name="German Waypoint Flag">
|
||||
<variant file="others/waypoints/base.xml" frequency="1" name="Germanic Waypoint Flag">
|
||||
<textures>
|
||||
<texture file="props/banner_germans.png" name="baseTex"/>
|
||||
<texture file="default_norm.png" name="normTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>props/germ_boat_head.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_boat.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>props/germ_boat_props.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_boat.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant name="German Karvi sail">
|
||||
<variant name="Germanic Karvi sail">
|
||||
<mesh>props/germ_karvi_sail.dae</mesh>
|
||||
<animations>
|
||||
<animation file="other/germ_sail_idle.dae" name="idle" speed="50"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German fishing boat prop">
|
||||
<variant frequency="1" name="Germanic fishing boat prop">
|
||||
<mesh>props/germ_dock_boat.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_fishing_boat.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Karvi">
|
||||
<variant frequency="1" name="Germanic Karvi">
|
||||
<mesh>props/germ_karvi_props.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_snekkja.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Karvi sail">
|
||||
<variant frequency="1" name="Germanic Karvi sail">
|
||||
<mesh>props/germ_karvi_sail.dae</mesh>
|
||||
<animations>
|
||||
<animation file="other/germ_sail_idle.dae" name="idle" speed="50"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Knarr Props">
|
||||
<variant frequency="1" name="Germanic Knarr Props">
|
||||
<mesh>props/germ_knarr_props.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_snekkja.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>props/germ_snekkja_head.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_snekkja.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>props/germ_snekkja_props.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_snekkja.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant name="German Snekkja Sail">
|
||||
<variant name="Germanic Snekkja Sail">
|
||||
<mesh>props/germ_snekkja_sail.dae</mesh>
|
||||
<animations>
|
||||
<animation file="other/germ_sail_idle.dae" name="idle" speed="50"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German wagon_unyoked">
|
||||
<variant name="Germanic wagon_unyoked">
|
||||
<mesh>props/germ_wagon_cc.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German Blacksmith">
|
||||
<variant name="Germanic Blacksmith">
|
||||
<mesh>structural/germans/blacksmith.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/structures/decals/dirt_4x4.xml" attachpoint="root"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Civic Center" file="structures/defensive_building.xml">
|
||||
<variant frequency="1" name="Germanic Civic Center" file="structures/defensive_building.xml">
|
||||
<mesh>structural/germans/cc.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/structures/decals/spart_5x5.xml" attachpoint="root"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="100" name="German fishing boat">
|
||||
<variant frequency="100" name="Germanic fishing boat">
|
||||
<mesh>structural/germans/fishing_boat.dae</mesh>
|
||||
<props>
|
||||
<prop actor="units/germans/fisherman.xml" attachpoint="fisherman"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant frequency="1" name="German House A">
|
||||
<variant frequency="1" name="Germanic House A">
|
||||
<mesh>structural/germans/house_a.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct_03.png" name="baseTex"/>
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
<prop actor="props/special/eyecandy/sack_1.xml" attachpoint="sack_2"/>
|
||||
</props>
|
||||
</variant>
|
||||
<variant frequency="1" name="German House A 2">
|
||||
<variant frequency="1" name="Germanic House A 2">
|
||||
<mesh>structural/germans/house_a_2.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct.png" name="baseTex"/>
|
||||
|
|
@ -74,7 +74,7 @@
|
|||
<prop actor="props/special/eyecandy/sack_1.xml" attachpoint="sack_2"/>
|
||||
</props>
|
||||
</variant>
|
||||
<variant frequency="1" name="German House B">
|
||||
<variant frequency="1" name="Germanic House B">
|
||||
<mesh>structural/germans/house_b.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct_03.png" name="baseTex"/>
|
||||
|
|
@ -105,7 +105,7 @@
|
|||
<prop actor="particle/smoke_blacksmith.xml" attachpoint="smoke"/>
|
||||
</props>
|
||||
</variant>
|
||||
<variant frequency="1" name="German House C">
|
||||
<variant frequency="1" name="Germanic House C">
|
||||
<mesh>structural/germans/house_c.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct_03.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Sentry Tower" file="structures/defensive_building.xml">
|
||||
<variant frequency="1" name="Germanic Sentry Tower" file="structures/defensive_building.xml">
|
||||
<mesh>structural/germans/wood_tower.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/structures/decals/dirt_1x1.xml" attachpoint="root"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>structural/germans/ship_arrow.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/structures/germans/boat_props.xml" attachpoint="mast"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>structural/germans/ship_karvi.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/units/weapons/bolt_tower.xml" attachpoint="projectile"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Merchant Ship">
|
||||
<variant frequency="1" name="Germanic Merchant Ship">
|
||||
<mesh>structural/germans/ship_knarr.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/structures/germans/knarr_props.xml" attachpoint="root"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>structural/germans/ship_scout.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/units/weapons/bolt_tower.xml" attachpoint="projectile"/>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<castshadow/>
|
||||
<float/>
|
||||
<group>
|
||||
<variant frequency="1" name="German Longboat">
|
||||
<variant frequency="1" name="Germanic Longboat">
|
||||
<mesh>structural/germans/ship_snekkja.dae</mesh>
|
||||
<props>
|
||||
<prop actor="props/units/weapons/bolt_tower.xml" attachpoint="projectile"/>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<actor version="1">
|
||||
<castshadow/>
|
||||
<group>
|
||||
<variant name="German Wall Tower" file="structures/defensive_building.xml">
|
||||
<variant name="Germanic Wall Tower" file="structures/defensive_building.xml">
|
||||
<mesh>structural/germans/wooden_wall_tower.dae</mesh>
|
||||
<textures>
|
||||
<texture file="structural/germ_struct_03.png" name="baseTex"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant name="Idle" frequency="1"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant name="Idle" frequency="1"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
<group>
|
||||
<!-- In this group, define overloads for other animation types, since they presumably do not collide with each other -->
|
||||
<variant name="Idle" frequency="1"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
<group>
|
||||
<!-- In this group, define overloads for other animation types, since they presumably do not collide with each other -->
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
<group>
|
||||
<!-- In this group, define overloads for other animation types, since they presumably do not collide with each other -->
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@
|
|||
<group>
|
||||
<!-- In this group, define overloads for other animation types, since they presumably do not collide with each other -->
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/female_death.xml"/>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<variant frequency="1" name="Idle"/>
|
||||
<variant file="biped/attack_capture.xml"/>
|
||||
<variant file="biped/attack_melee_female.xml"/>
|
||||
<variant file="biped/attack_slaughter.xml"/>
|
||||
<variant file="biped/gather_tree.xml"/>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ba424950305b85425bcd63d601bc3e49b8546e5d34ffc96c57b23b2b7cbce95a
|
||||
size 112876
|
||||
oid sha256:6e79ff8aed597b9c97eb7a1aeccdcc6a0a62aac4fe3ac3f5708a6dc210fba18c
|
||||
size 124346
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e0d32bf35b91ce84c6567cd6c925ec61e47f247b4a7713dcbe6e9cccc4a68fd2
|
||||
size 271942
|
||||
|
|
@ -14,7 +14,7 @@ class AutoStartHost
|
|||
const port = +(cmdLineArgs['autostart-port'] ?? 5073);
|
||||
|
||||
// Password not implemented for autostart.
|
||||
Engine.StartNetworkHost(playerName, port, "", !('autostart-disable-replay' in cmdLineArgs));
|
||||
Engine.StartNetworkHost(playerName, port, "", false, !('autostart-disable-replay' in cmdLineArgs));
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
{ "name": "Micha L. Rieser" },
|
||||
{ "nick": "Nescio" },
|
||||
{ "nick": "nifa" },
|
||||
{ "nick": "Obskurias", "name": "Alejandro Liaño" },
|
||||
{ "name": "Paul Maritz" },
|
||||
{ "nick": "pedro_blanco", "name": "Pedro Blanco" },
|
||||
{ "name": "Pete Unseth" },
|
||||
|
|
|
|||
|
|
@ -146,6 +146,7 @@
|
|||
{ "nick": "javiergodas", "name": "Javier Godas Vieitez" },
|
||||
{ "nick": "JCWasmx86" },
|
||||
{ "nick": "Jgwman" },
|
||||
{ "nick": "joeybadz", "name": "Joe Badlato" },
|
||||
{ "nick": "JonBaer", "name": "Jon Baer" },
|
||||
{ "nick": "Josh", "name": "Joshua J. Bakita" },
|
||||
{ "nick": "joskar", "name": "Johnny Oskarsson" },
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ class PersistentMatchSettings
|
|||
Engine.FileExists(this.filename) &&
|
||||
Engine.ReadJSONFile(this.filename);
|
||||
|
||||
const persistedSettings = data?.engine_info?.engine_version == this.engineInfo.engine_version &&
|
||||
const persistedSettings = data?.engine_info?.engine_serialization_version &&
|
||||
data.engine_info.engine_serialization_version == this.engineInfo.engine_serialization_version &&
|
||||
hasSameMods(data?.engine_info?.mods, this.engineInfo.mods) &&
|
||||
data.attributes || {};
|
||||
|
||||
|
|
|
|||
|
|
@ -174,8 +174,8 @@ class SavegameList
|
|||
isCompatibleSavegame(metadata, engineInfo)
|
||||
{
|
||||
return engineInfo &&
|
||||
metadata.engine_version &&
|
||||
metadata.engine_version == engineInfo.engine_version &&
|
||||
metadata.engine_serialization_version &&
|
||||
metadata.engine_serialization_version == engineInfo.engine_serialization_version &&
|
||||
hasSameMods(metadata.mods, engineInfo.mods);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,9 +24,9 @@ class SavegameLoader
|
|||
// Check compatibility before really loading it
|
||||
const engineInfo = Engine.GetEngineInfo();
|
||||
const sameMods = hasSameMods(metadata.mods, engineInfo.mods);
|
||||
const sameEngineVersion = metadata.engine_version && metadata.engine_version == engineInfo.engine_version;
|
||||
const compatibleEngineVersions = metadata.engine_serialization_version && metadata.engine_serialization_version == engineInfo.engine_serialization_version;
|
||||
|
||||
if (sameEngineVersion && sameMods)
|
||||
if (compatibleEngineVersions && sameMods)
|
||||
{
|
||||
this.closePageCallback(gameId);
|
||||
return;
|
||||
|
|
@ -35,14 +35,17 @@ class SavegameLoader
|
|||
// Version not compatible ... ask for confirmation
|
||||
let message = "";
|
||||
|
||||
if (!sameEngineVersion)
|
||||
if (metadata.engine_version)
|
||||
message += sprintf(translate("This savegame needs 0 A.D. version %(requiredVersion)s, while you are running version %(currentVersion)s."), {
|
||||
"requiredVersion": metadata.engine_version,
|
||||
"currentVersion": engineInfo.engine_version
|
||||
if (!compatibleEngineVersions)
|
||||
{
|
||||
if (metadata.engine_serialization_version)
|
||||
message += sprintf(translate("This savegame needs 0 A.D. version %(requiredCompatibleVersion)s or compatible. You are running version %(currentVersion)s, compatible down to %(compatibleVersion)s."), {
|
||||
"requiredCompatibleVersion": metadata.engine_serialization_version,
|
||||
"currentVersion": engineInfo.engine_version,
|
||||
"compatibleVersion": engineInfo.engine_serialization_version,
|
||||
}) + "\n";
|
||||
else
|
||||
message += translate("This savegame needs an older version of 0 A.D.") + "\n";
|
||||
}
|
||||
|
||||
if (!sameMods)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ export const projectInformation = {
|
|||
"caption": getBuildString()
|
||||
},
|
||||
"productDescription": {
|
||||
"caption": setStringTags(translate("Release XXVIII: B——"), { "font": "sans-bold-16" }) + "\n\n" +
|
||||
"caption": setStringTags(translate("Release XXVIII: Boiorix"), { "font": "sans-bold-16" }) + "\n\n" +
|
||||
translate("Notice: This game is under development and many features have not been added yet.")
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -42,4 +42,6 @@ async function cancelButton()
|
|||
await new Promise(resolve => { Engine.GetGUIObjectByName("cancel").onPress = resolve; });
|
||||
if (Engine.HasXmppClient())
|
||||
Engine.StopXmppClient();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ function loginButton()
|
|||
Engine.OpenChildPage("page_prelobby_login.xml");
|
||||
}
|
||||
|
||||
function registerButton()
|
||||
async function registerButton()
|
||||
{
|
||||
Engine.OpenChildPage("page_prelobby_register.xml");
|
||||
if (await Engine.OpenChildPage("page_prelobby_register.xml"))
|
||||
Engine.OpenChildPage("page_prelobby_login.xml");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,6 +40,5 @@ async function onRegistered()
|
|||
setFeedback(translate("Registered"));
|
||||
|
||||
Engine.StopXmppClient();
|
||||
|
||||
Engine.OpenChildPage("page_prelobby_login.xml");
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ function reallyStartVisualReplay(replayDirectory)
|
|||
function displayReplayCompatibilityError(replay)
|
||||
{
|
||||
var errMsg;
|
||||
if (replayHasSameEngineVersion(replay))
|
||||
if (replayHasCompatibleEngineVersion(replay))
|
||||
{
|
||||
const gameMods = replay.attribs.mods || [];
|
||||
errMsg = translate("This replay needs a different sequence of mods:") + "\n" +
|
||||
|
|
@ -93,8 +93,9 @@ function displayReplayCompatibilityError(replay)
|
|||
else
|
||||
{
|
||||
errMsg = translate("This replay is not compatible with your version of the game!") + "\n";
|
||||
errMsg += sprintf(translate("Your version: %(version)s"), { "version": g_EngineInfo.engine_version }) + "\n";
|
||||
errMsg += sprintf(translate("Required version: %(version)s"), { "version": replay.attribs.engine_version });
|
||||
errMsg += sprintf(translate("Your version: %(version)s, compatible down to %(compatibleVersion)s"), { "version": g_EngineInfo.engine_version, "compatibleVersion": g_EngineInfo.engine_serialization_version }) + "\n";
|
||||
if (replay.attribs.engine_serialization_version)
|
||||
errMsg += sprintf(translate("Replay version: %(version)s"), { "version": replay.attribs.engine_serialization_version });
|
||||
}
|
||||
|
||||
messageBox(500, 200, errMsg, translate("Incompatible replay"));
|
||||
|
|
|
|||
|
|
@ -360,13 +360,13 @@ function getReplayDuration(replay)
|
|||
*/
|
||||
function isReplayCompatible(replay)
|
||||
{
|
||||
return replayHasSameEngineVersion(replay) && hasSameMods(replay.attribs.mods, g_EngineInfo.mods);
|
||||
return replayHasCompatibleEngineVersion(replay) && hasSameMods(replay.attribs.mods, g_EngineInfo.mods);
|
||||
}
|
||||
|
||||
/**
|
||||
* True if we can start the given replay with the currently loaded mods.
|
||||
*/
|
||||
function replayHasSameEngineVersion(replay)
|
||||
function replayHasCompatibleEngineVersion(replay)
|
||||
{
|
||||
return replay.attribs.engine_version && replay.attribs.engine_version == g_EngineInfo.engine_version;
|
||||
return replay.attribs.engine_serialization_version && replay.attribs.engine_serialization_version == g_EngineInfo.engine_serialization_version;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -705,7 +705,7 @@ function updateCinemaPath()
|
|||
{
|
||||
// TODO: Keyboard shortcuts can still try to toggle silhouettes
|
||||
// which would behave incorrectly on reset.
|
||||
Engine.ConfigDB_Reload();
|
||||
Engine.ConfigDB_Reload("user");
|
||||
g_HasHiddenSilhouettes = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
<!-- IMPORTANT: remember to update pregame/ProjectInformation.js in sync with this: -->
|
||||
<object type="text" style="ModernLabelText" text_valign="top" ghost="true" size="0% 1 100% 100%">
|
||||
<translatableAttribute id="caption">Release XXVIII: B——</translatableAttribute>
|
||||
<translatableAttribute id="caption">Release XXVIII: Boiorix</translatableAttribute>
|
||||
</object>
|
||||
|
||||
<!-- Displays build date and build version-->
|
||||
|
|
|
|||
|
|
@ -1550,7 +1550,8 @@ var g_EntityCommands =
|
|||
"stop": {
|
||||
"getInfo": function(entStates)
|
||||
{
|
||||
if (entStates.every(entState => !entState.unitAI))
|
||||
// Don't show generic option to abort if not applicable or in case of guard, which has its own abort action
|
||||
if (entStates.every(entState => !entState.unitAI || entState.unitAI.isIdle || entState.unitAI.isGuarding))
|
||||
return false;
|
||||
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -265,8 +265,8 @@ function initGUICharts()
|
|||
function resizeDropdown(dropdown)
|
||||
{
|
||||
dropdown.size.bottom = dropdown.size.top +
|
||||
(Engine.GetTextWidth(dropdown.font, dropdown.list[dropdown.selected]) >
|
||||
dropdown.size.right - dropdown.size.left - 28 &&
|
||||
(dropdown.getPreferredHeaderTextSize().width >
|
||||
dropdown.size.right - dropdown.size.left - dropdown.button_width &&
|
||||
dropdown.list[dropdown.selected].indexOf(" ") !== -1 ? 42 : 28);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -480,15 +480,6 @@
|
|||
"AttackName": {
|
||||
"customContext": "Name of an attack, usually the weapon."
|
||||
},
|
||||
"StatusName": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"ApplierTooltip": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"ReceiverTooltip": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"GenericName": {},
|
||||
"SpecificName": {},
|
||||
"History": {},
|
||||
|
|
@ -523,15 +514,6 @@
|
|||
"AttackName": {
|
||||
"customContext": "Name of an attack, usually the weapon."
|
||||
},
|
||||
"StatusName": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"ApplierTooltip": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"ReceiverTooltip": {
|
||||
"customContext": "status effect"
|
||||
},
|
||||
"GenericName": {},
|
||||
"SpecificName": {},
|
||||
"History": {},
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export function* generateMap()
|
|||
const ePine = "gaia/tree/aleppo_pine";
|
||||
const ePalmTall = "gaia/tree/cretan_date_palm_tall";
|
||||
const eFanPalm = "gaia/tree/medit_fan_palm";
|
||||
const eApple = "gaia/fruit/apple";
|
||||
const eCypress = "gaia/tree/cypress";
|
||||
const eBush = "gaia/fruit/berry_01";
|
||||
const eFish = "gaia/fish/generic";
|
||||
const ePig = "gaia/fauna_pig";
|
||||
|
|
@ -68,6 +68,7 @@ export function* generateMap()
|
|||
const clCreek = g_Map.createTileClass();
|
||||
const clWater = g_Map.createTileClass();
|
||||
const clCliffs = g_Map.createTileClass();
|
||||
const clFish = g_Map.createTileClass();
|
||||
const clForest = g_Map.createTileClass();
|
||||
const clShore = g_Map.createTileClass();
|
||||
const clPlayer = g_Map.createTileClass();
|
||||
|
|
@ -75,19 +76,19 @@ export function* generateMap()
|
|||
const clPassage = g_Map.createTileClass();
|
||||
const clSettlement = g_Map.createTileClass();
|
||||
|
||||
const radiusBeach = fractionToTiles(0.57);
|
||||
const radiusCreeks = fractionToTiles(0.52);
|
||||
const radiusIsland = fractionToTiles(0.4);
|
||||
const radiusLevel1 = fractionToTiles(0.35);
|
||||
const radiusPlayer = fractionToTiles(0.25);
|
||||
const radiusLevel2 = fractionToTiles(0.2);
|
||||
const radiusBeach = fractionToTiles(0.65);
|
||||
const radiusCreeks = fractionToTiles(0.60);
|
||||
const radiusIsland = fractionToTiles(0.46);
|
||||
const radiusLevel1 = fractionToTiles(0.40);
|
||||
const radiusPlayer = fractionToTiles(0.29);
|
||||
const radiusLevel2 = fractionToTiles(0.20);
|
||||
|
||||
const creeksArea = () => randBool() ? randFloat(10, 50) : scaleByMapSize(75, 100) + randFloat(0, 20);
|
||||
|
||||
const nbCreeks = scaleByMapSize(6, 15);
|
||||
const nbCreeks = scaleByMapSize(7, 9);
|
||||
const nbSubIsland = 5;
|
||||
const nbBeaches = scaleByMapSize(2, 5);
|
||||
const nbPassagesLevel1 = scaleByMapSize(4, 8);
|
||||
const nbBeaches = scaleByMapSize(6, 10);
|
||||
const nbPassagesLevel1 = scaleByMapSize(6, 8);
|
||||
const nbPassagesLevel2 = scaleByMapSize(2, 4);
|
||||
|
||||
g_Map.log("Creating Corsica and Sardinia");
|
||||
|
|
@ -183,9 +184,9 @@ export function* generateMap()
|
|||
new Vector2D(radiusLevel1 + 10, 0).rotate(-angle)),
|
||||
"end": Vector2D.add(islandLocations[island],
|
||||
new Vector2D(radiusLevel1 - 4, 0).rotate(-angle)),
|
||||
"startWidth": 10,
|
||||
"endWidth": 6,
|
||||
"smoothWidth": 3,
|
||||
"startWidth": 20,
|
||||
"endWidth": 20,
|
||||
"smoothWidth": 2,
|
||||
"tileClass": clPassage
|
||||
});
|
||||
}
|
||||
|
|
@ -212,8 +213,8 @@ export function* generateMap()
|
|||
new Vector2D(radiusLevel2 + 3, 0).rotate(-angle)),
|
||||
"end": Vector2D.add(islandLocations[island],
|
||||
new Vector2D(radiusLevel2 - 6, 0).rotate(-angle)),
|
||||
"startWidth": 4,
|
||||
"endWidth": 6,
|
||||
"startWidth": 20,
|
||||
"endWidth": 20,
|
||||
"smoothWidth": 2,
|
||||
"tileClass": clPassage
|
||||
});
|
||||
|
|
@ -409,7 +410,7 @@ export function* generateMap()
|
|||
new SimpleObject(ePine, 3, 6, 1, 3),
|
||||
new SimpleObject(ePalmTall, 1, 3, 1, 3),
|
||||
new SimpleObject(eFanPalm, 0, 2, 0, 2),
|
||||
new SimpleObject(eApple, 0, 1, 1, 2)
|
||||
new SimpleObject(eCypress, 0, 1, 1, 2)
|
||||
],
|
||||
true,
|
||||
clForest),
|
||||
|
|
@ -515,36 +516,34 @@ export function* generateMap()
|
|||
50);
|
||||
|
||||
g_Map.log("Creating fish");
|
||||
createObjectGroupsDeprecated(
|
||||
new SimpleGroup([new SimpleObject(eFish, 1, 2, 0, 3)]),
|
||||
0,
|
||||
[
|
||||
stayClasses(clWater, 3),
|
||||
avoidClasses(clCreek, 3, clShore, 3)
|
||||
],
|
||||
scaleByMapSize(100, 150),
|
||||
300);
|
||||
|
||||
createFood(
|
||||
[
|
||||
[new SimpleObject(eFish, 2, 3, 0, 2)]
|
||||
],
|
||||
[
|
||||
50 * numPlayers
|
||||
],
|
||||
[
|
||||
avoidClasses(clCreek, 2, clShore, 3, clFish, 8),
|
||||
stayClasses(clWater, 3)
|
||||
],
|
||||
clFish);
|
||||
|
||||
g_Map.log("Creating shore fish");
|
||||
createObjectGroupsDeprecated(
|
||||
new SimpleGroup([new SimpleObject(eFish, 1, 2, 0, 3)]),
|
||||
0,
|
||||
[
|
||||
stayClasses(clCreek, 1),
|
||||
],
|
||||
scaleByMapSize(200, 300),
|
||||
500);
|
||||
|
||||
g_Map.log("Creating shore fish");
|
||||
createObjectGroupsDeprecated(
|
||||
new SimpleGroup([new SimpleObject(eFish, 1, 2, 0, 3)]),
|
||||
0,
|
||||
createFood(
|
||||
[
|
||||
stayClasses(clShore, 3)
|
||||
[new SimpleObject(eFish, 2, 3, 0, 2)]
|
||||
],
|
||||
scaleByMapSize(200, 300),
|
||||
500);
|
||||
[
|
||||
70 * numPlayers
|
||||
],
|
||||
[
|
||||
avoidClasses(clFish, 6),
|
||||
stayClasses(clWater, 3, clShore, 0)
|
||||
],
|
||||
clFish);
|
||||
|
||||
yield 95;
|
||||
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ export function* generateMap(mapSettings)
|
|||
const playerIDs = randBool() ? sortAllPlayers() : primeSortAllPlayers();
|
||||
|
||||
g_Map.log("Ensuring player territory");
|
||||
const playerRadius = scaleByMapSize(12, 20);
|
||||
const playerRadius = scaleByMapSize(15, 20);
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
createArea(
|
||||
new ChainPlacer(1, 6, 40, 1, playerPosition[i], 0, [Math.floor(playerRadius)]),
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@ Trigger.prototype.InitStartingUnits = function()
|
|||
{
|
||||
this.playerCivicCenter[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "CivilCentre")[0];
|
||||
this.treasureCivilian[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "Civilian")[0];
|
||||
Engine.QueryInterface(this.treasureCivilian[playerID], IID_Resistance).SetInvulnerability(true);
|
||||
if (this.treasureCivilian[playerID])
|
||||
{
|
||||
Engine.QueryInterface(this.treasureCivilian[playerID], IID_Resistance)
|
||||
.SetInvulnerability(true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:64c4b5bcd2aa0594fe563636ae2591a280c266b7d3d5acf3ed93342591dbd728
|
||||
size 656879
|
||||
21561
binaries/data/mods/public/maps/scenarios/sandbox_germans.xml
Normal file
21561
binaries/data/mods/public/maps/scenarios/sandbox_germans.xml
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -16,12 +16,12 @@ Trigger.prototype.tutorialGoals = [
|
|||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("To start off, select your building, the Civic Center, by clicking on it. A selection ring in the color of your civilization will be displayed after clicking.")
|
||||
markForTranslation("To start off, select your building, the Civic Center, by clicking on it. A selection ring in the color of your player will be displayed after clicking.")
|
||||
]
|
||||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("Now that the Civic Center is selected, you will notice that a production panel will appear on the lower right of your screen detailing the actions that the buildings supports. For the production panel, available actions are not masked in any color, while an icon masked in either gray or red indicates that the action has not been unlocked or you do not have sufficient resources to perform that action, respectively. Additionally, you can hover the cursor over any icon to show a tooltip with more details.\n"),
|
||||
markForTranslation("Now that the Civic Center is selected, you will notice that a production panel will appear on the lower right of your screen detailing the actions that the buildings supports. For the production panel, available actions are not masked in any color, while an icon masked in gray indicates that the action has not been unlocked and a red mask indicates that you do not have sufficient resources to perform that action. Additionally, you can hover the cursor over any icon to show a tooltip with more details.\n"),
|
||||
markForTranslation("The top row of buttons contains portraits of units that may be trained at the building while the bottom one or two rows will have researchable technologies. Hover the cursor over the II icon. The tooltip will tell us that advancing to Town Phase requires both more constructed structures as well as more food and wood resources.")
|
||||
]
|
||||
},
|
||||
|
|
@ -40,7 +40,10 @@ Trigger.prototype.tutorialGoals = [
|
|||
markForTranslation("At this point, food and wood are the most important resources for developing your economy, so let's start with gathering food. Civilians gather vegetables faster than other units.\n"),
|
||||
markForTranslation("There are primarily three ways to select units:\n"),
|
||||
markForTranslation("1) Hold the left mouse button and drag a selection rectangle that encloses the units you want to select.\n"),
|
||||
markForTranslation("2) Click on one of them and then add additional units to your selection by holding Shift and clicking each additional unit (or also via the above selection rectangle).\n"),
|
||||
{
|
||||
"text": markForTranslation("2) Click on one of them and then add additional units to your selection by holding %(hotkey)s and clicking each additional unit (or also via the above selection rectangle).\n"),
|
||||
"hotkey": "selection.add"
|
||||
},
|
||||
{
|
||||
"text": markForTranslation("3) Double-click on a unit. This will select every unit of the same type as the specified unit in your visible window. %(hotkey)s+double-click will select all units of the same type on the entire map.\n"),
|
||||
"hotkey": "selection.offscreen"
|
||||
|
|
@ -67,7 +70,7 @@ Trigger.prototype.tutorialGoals = [
|
|||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("Cavalry Citizen Soldiers are good for hunting. Select your Cavalry and order him to hunt the chickens around your Civic Center in similar fashion.")
|
||||
markForTranslation("Cavalry Citizen Soldiers are good for hunting. Select your Cavalry and order him to slaughter the chickens around your Civic Center in similar fashion.")
|
||||
],
|
||||
"OnPlayerCommand": function(msg)
|
||||
{
|
||||
|
|
@ -98,7 +101,10 @@ Trigger.prototype.tutorialGoals = [
|
|||
{
|
||||
"instructions": [
|
||||
markForTranslation("Now that the rally point is set, we can produce additional units and they will do their assigned task automatically.\n"),
|
||||
markForTranslation("Citizen Soldiers gather wood faster than Civilians. Select the Civic Center and, while holding Shift, click on the second unit icon, the Hoplites (holding Shift trains a batch of five units). You can also train units individually by simply clicking, but training 5 units together takes less time than training 5 units individually.")
|
||||
{
|
||||
"text": markForTranslation("Citizen Soldiers gather wood faster than Civilians. Select the Civic Center and, while holding %(hotkey)s, click on the second unit icon, the Hoplites (holding %(hotkey)s trains a batch of five units). You can also train units individually by simply clicking, but training 5 units together takes less time than training 5 units individually."),
|
||||
"hotkey": "session.batchtrain"
|
||||
}
|
||||
],
|
||||
"OnTrainingQueued": function(msg)
|
||||
{
|
||||
|
|
@ -108,8 +114,8 @@ Trigger.prototype.tutorialGoals = [
|
|||
const cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);
|
||||
cmpProductionQueue.ResetQueue();
|
||||
const txt = +msg.count == 1 ?
|
||||
markForTranslation("Do not forget to hold Shift while clicking to train several units.") :
|
||||
markForTranslation("Hold Shift and click on the Hoplite icon.");
|
||||
markForTranslation("Do not forget to hold the hotkey while clicking to train several units.") :
|
||||
markForTranslation("The second icon represents the Hoplites.");
|
||||
this.WarningMessage(txt);
|
||||
return;
|
||||
}
|
||||
|
|
@ -153,7 +159,24 @@ Trigger.prototype.tutorialGoals = [
|
|||
{
|
||||
"instructions": [
|
||||
markForTranslation("When construction finishes, the builders default to gathering wood automatically.\n"),
|
||||
markForTranslation("Let's train some Civilians to gather more food. Select the Civic Center, hold Shift and click on the Civilian icon to train five Civilians.")
|
||||
markForTranslation("In the meantime, we seem to have enough workers gathering wood. We should remove the current rally point of the Civic Center away from gathering wood. For that purpose, right-click on the Civic Center when it is selected (and the flag icon indicating the rally point is crossed out).")
|
||||
],
|
||||
"OnPlayerCommand": function(msg)
|
||||
{
|
||||
if (msg.cmd.type == "unset-rallypoint")
|
||||
this.NextGoal();
|
||||
},
|
||||
"OnTrainingFinished": function(msg)
|
||||
{
|
||||
this.trainingDone = true;
|
||||
}
|
||||
},
|
||||
{
|
||||
"instructions": [
|
||||
{
|
||||
"text": markForTranslation("Let's train some Civilians to gather more food. Select the Civic Center, hold %(hotkey)s and click on the Civilian icon to train five Civilians."),
|
||||
"hotkey": "session.batchtrain"
|
||||
}
|
||||
],
|
||||
"Init": function()
|
||||
{
|
||||
|
|
@ -167,29 +190,14 @@ Trigger.prototype.tutorialGoals = [
|
|||
const cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);
|
||||
cmpProductionQueue.ResetQueue();
|
||||
const txt = +msg.count == 1 ?
|
||||
markForTranslation("Do not forget to hold Shift and click to train several units.") :
|
||||
markForTranslation("Hold shift and click on the Civilian icon.");
|
||||
markForTranslation("Do not forget to hold the hotkey and click to train several units.") :
|
||||
markForTranslation("The first icon represents the Civilians.");
|
||||
this.WarningMessage(txt);
|
||||
return;
|
||||
}
|
||||
this.NextGoal();
|
||||
}
|
||||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("Let's wait for the units to be trained.\n"),
|
||||
markForTranslation("In the meantime, we seem to have enough workers gathering wood. We should remove the current rally point of the Civic Center away from gathering wood. For that purpose, right-click on the Civic Center when it is selected (and the flag icon indicating the rally point is crossed out).")
|
||||
],
|
||||
"OnPlayerCommand": function(msg)
|
||||
{
|
||||
if (msg.cmd.type == "unset-rallypoint")
|
||||
this.NextGoal();
|
||||
},
|
||||
"OnTrainingFinished": function(msg)
|
||||
{
|
||||
this.trainingDone = true;
|
||||
}
|
||||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("The units should be ready soon.\n"),
|
||||
|
|
@ -212,8 +220,14 @@ Trigger.prototype.tutorialGoals = [
|
|||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("Select two of your newly-trained Civilians and ask them to build these Houses in the empty space to the east of the Civic Center. To do so, after selecting the Civilians, click on the House icon in the bottom right panel and, while holding Shift, click first on the position in the map where you want to build the first House, and then click on the position where you want to build the second House (when you give a command while holding Shift, you put the command in a queue; units automatically switch to the next command in their queue when they finish their current command). Press Escape to get rid of the House cursor so you don't spam Houses all over the map.\n"),
|
||||
markForTranslation("Reminder: to select only two Civilians, click on the first one and then hold Shift and click on the second one.")
|
||||
{
|
||||
"text": markForTranslation("Select two of your newly-trained Civilians and order them to build these Houses in the empty space to the east of the Civic Center. Click on the House icon in the bottom right panel. While holding %(hotkey)s click on positions on the map where you want to build Houses. The Civilians will then start to build the houses in order. (When you give a command while holding %(hotkey)s, you put the command in a queue; units automatically switch to the next command in their queue when they finish their current command). Press Escape to get rid of the House cursor so you don't spam Houses all over the map.\n"),
|
||||
"hotkey": "selection.queue"
|
||||
},
|
||||
{
|
||||
"text": markForTranslation("Reminder: to select only two Civilians, click on the first one and then hold %(hotkey) and click on the second one."),
|
||||
"hotkey": "selection.add"
|
||||
}
|
||||
],
|
||||
"Init": function()
|
||||
{
|
||||
|
|
@ -260,7 +274,10 @@ Trigger.prototype.tutorialGoals = [
|
|||
"instructions": [
|
||||
markForTranslation("Select the three remaining (idle) Civilians and order them to build a Farmstead in the center of the large open area to the west of the Civic Center.\n"),
|
||||
markForTranslation("We will need a decent chunk of space around the Farmstead to build Fields. In addition, we can see goats on the west side to further improve our food gathering efficiency should we ever decide to hunt them.\n"),
|
||||
markForTranslation("If you try to select the three idle Civilians by clicking and dragging a selection rectangle over them, you might accidentally select additional units. To avoid that, hold the I key while selecting so that only idle units are selected. If you accidentally select a cavalry unit, hold Ctrl and click on the cavalry unit icon of the selection panel at the bottom of the screen to remove the cavalry unit from the current selection.")
|
||||
{
|
||||
"text": markForTranslation("If you try to select the three idle Civilians by clicking and dragging a selection rectangle over them, you might accidentally select additional units. To avoid that, hold %(hotkey)s while selecting so that only idle units are selected. If you accidentally select a cavalry unit, hold Ctrl and click on the cavalry unit icon of the selection panel at the bottom of the screen to remove the cavalry unit from the current selection."),
|
||||
"hotkey": "selection.idleonly"
|
||||
}
|
||||
],
|
||||
"OnPlayerCommand": function(msg)
|
||||
{
|
||||
|
|
@ -344,7 +361,7 @@ Trigger.prototype.tutorialGoals = [
|
|||
const cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);
|
||||
cmpProductionQueue.ResetQueue();
|
||||
const txt = +msg.count != 1 ?
|
||||
markForTranslation("Click without holding Shift to train a single unit.") :
|
||||
markForTranslation("Click without holding a hotkey to train a single unit.") :
|
||||
markForTranslation("Click on the Civilian icon.");
|
||||
this.WarningMessage(txt);
|
||||
return;
|
||||
|
|
@ -415,7 +432,10 @@ Trigger.prototype.tutorialGoals = [
|
|||
},
|
||||
{
|
||||
"instructions": [
|
||||
markForTranslation("Thus, we should order them to deposit their wood in the Civic Center along the way. To do so, we will hold Shift while clicking to queue orders: select your soldiers, hold Shift and right-click on the Civic Center to deposit their wood and then hold Shift and right-click on the stone quarry to gather it.\n"),
|
||||
{
|
||||
"text": markForTranslation("Thus, we should order them to deposit their wood in the Civic Center along the way. To do so, we will hold %(hotkey)s while clicking to queue orders: select your soldiers, hold %(hotkey)s and right-click on the Civic Center to deposit their wood and then hold %(hotkey)s and right-click on the stone quarry to gather it.\n"),
|
||||
"hotkey": "selection.queue"
|
||||
},
|
||||
markForTranslation("Perform a similar order queue with the remaining soldiers and the metal mine in the west.")
|
||||
],
|
||||
"Init": function()
|
||||
|
|
|
|||
|
|
@ -84,8 +84,8 @@ PetraBot.prototype.CustomInit = function(gameState)
|
|||
|
||||
this.HQ.init(gameState, this.queues);
|
||||
|
||||
// Analyze our starting position and set a strategy
|
||||
this.HQ.gameAnalysis(gameState);
|
||||
// Try to analyze our starting position and set a strategy.
|
||||
this.canPlay = this.HQ.gameAnalysis(gameState);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -112,10 +112,10 @@ PetraBot.prototype.OnUpdate = function(sharedScript)
|
|||
|
||||
this.playedTurn++;
|
||||
|
||||
if (this.gameState.getOwnEntities().length === 0)
|
||||
if (!this.canPlay)
|
||||
{
|
||||
Engine.ProfileStop();
|
||||
return; // With no entities to control the AI cannot do anything
|
||||
return;
|
||||
}
|
||||
|
||||
this.HQ.update(this.gameState, this.queues, this.savedEvents);
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Headquarters.prototype.gameAnalysis = function(gameState)
|
|||
{
|
||||
// Analysis of the terrain and the different access regions
|
||||
if (!this.regionAnalysis(gameState))
|
||||
return;
|
||||
return false;
|
||||
|
||||
this.attackManager.init(gameState);
|
||||
this.buildManager.init(gameState);
|
||||
|
|
@ -57,6 +57,8 @@ Headquarters.prototype.gameAnalysis = function(gameState)
|
|||
// configure our first base strategy
|
||||
if (this.hasPotentialBase())
|
||||
this.configFirstBase(gameState);
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -105,12 +105,17 @@ Attack.prototype.Schema =
|
|||
"<element>" +
|
||||
"<anyName a:help='Currently one of Melee, Ranged, Capture or Slaughter.'/>" +
|
||||
"<interleave>" +
|
||||
"<element name='AttackName' a:help='Name of the attack, to be displayed in the GUI. Optionally includes a translate context attribute.'>" +
|
||||
"<element name='AttackName' a:help='Name of the attack, to be displayed in the GUI.'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
AttackHelper.BuildAttackEffectsSchema() +
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ Barter.prototype.ExchangeResources = function(playerID, resourceToSell, resource
|
|||
cmpStatisticsTracker.IncreaseResourcesBoughtCounter(resourceToBuy, amountToAdd);
|
||||
}
|
||||
|
||||
const difference = this.DIFFERENCE_PER_DEAL * amount / this.DEAL_AMOUNT;
|
||||
const difference = this.DIFFERENCE_PER_DEAL * amountToAdd / this.DEAL_AMOUNT;
|
||||
// Overall price difference (dynamic +/- constant) can't exceed +-99%.
|
||||
const maxDifference = this.DEAL_AMOUNT * 0.99;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,16 @@ BuildRestrictions.prototype.Schema =
|
|||
"<element name='Distance' a:help='Specifies distance restrictions on this building, relative to buildings from the given category.'>" +
|
||||
"<interleave>" +
|
||||
"<element name='FromClass'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"<optional><element name='MinDistance'><data type='positiveInteger'/></element></optional>" +
|
||||
|
|
|
|||
|
|
@ -9,6 +9,16 @@ Formation.prototype.Schema =
|
|||
"</data>" +
|
||||
"</element>" +
|
||||
"<element name='DisabledTooltip' a:help='Tooltip shown when the formation is disabled.'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"<element name='SpeedMultiplier' a:help='The speed of the formation is determined by the minimum speed of all members, multiplied with this number.'>" +
|
||||
|
|
|
|||
|
|
@ -25,10 +25,30 @@ Identity.prototype.Schema =
|
|||
"</element>" +
|
||||
"</optional>" +
|
||||
"<element name='GenericName' a:help='Generic English-language name for this entity.'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"<optional>" +
|
||||
"<element name='SpecificName' a:help='Specific native-language name for this entity.'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"</optional>" +
|
||||
|
|
@ -39,16 +59,46 @@ Identity.prototype.Schema =
|
|||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<element name='Tooltip'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<element name='History'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<text/>" +
|
||||
"</element>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<element name='Rank'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<choice>" +
|
||||
"<value>Basic</value>" +
|
||||
"<value>Advanced</value>" +
|
||||
|
|
@ -66,6 +116,16 @@ Identity.prototype.Schema =
|
|||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<element name='VisibleClasses' a:help='Optional list of space-separated classes applying to this entity. These classes will also be visible in various GUI elements. Choices include: Academy, Amphitheater, Archer, ArmyCamp, ArrowShip, Arsenal, ArtilleryTower, Auxiliary, Axeman, Barracks, BoltShooter, BoltTower, Bribable, Builder, Camel, Cataphract, Cavalry, Centurion, Champion, Chariot, Citizen, City, Civilian, Civic, CivilCentre, Colony, Corral, Council, Crossbowman, Defensive, Dock, Dog, Economic, Elephant, ElephantStable, Embassy, Farmstead, Field, Fireship, FishingBoat, Forge, Fortress, Gate, Gladiator, GreatTower, Gymnasium, Hall, Healer, Heavy, Hero, House, IceHouse, Ignited, Immortal, ImperialCourt, ImperialMinistry, Infantry, Javelineer, Kennel, LaoziGate, Legionary, Library, Lighthouse, Longsword, Maceman, Melee, Market, Mercenary, Military, Minister, Monument, Naval, NavalRam, NavalSiege, Outpost, Palace, Palisade, Pikeman, Pillar, Pirate, Pyramid, Ram, Range, Ranged, Relic, Resource, RotaryMill, ScoutShip, SentryTower, Ship, Shipyard, Shrine, Siege, SiegeTower, SiegeWall, Slave, Slinger, Soldier, Spearman, Stable, Stoa, StoneThrower, StoneTower, Storehouse, Support, Swordsman, Syssiton, Temple, TempleOfAmun, TempleOfApedemak, TempleOfIsis, TempleOfMars, TempleOfVesta, Tent, Theater, Tower, Town, Trade, Trader, TriumphalArch, Trumpeter, Village, Wall, Warship, Wonder, Worker.'>" +
|
||||
"<optional>" +
|
||||
"<attribute name='context'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<optional>" +
|
||||
"<attribute name='comment'>" +
|
||||
"<text/>" +
|
||||
"</attribute>" +
|
||||
"</optional>" +
|
||||
"<attribute name='datatype'>" +
|
||||
"<value>tokens</value>" +
|
||||
"</attribute>" +
|
||||
|
|
|
|||
|
|
@ -17,13 +17,11 @@ PopulationCapManager.prototype.Init = function()
|
|||
*/
|
||||
PopulationCapManager.prototype.SetPopulationCapType = function(type)
|
||||
{
|
||||
if ([this.CAPTYPE_PLAYER_POPULATION, this.CAPTYPE_TEAM_POPULATION, this.CAPTYPE_WORLD_POPULATION].includes(type))
|
||||
this.popCapType = type;
|
||||
else
|
||||
{
|
||||
warn(`Attempted to set an unknown population capacity type: '${type}'. Continuing with type 'Player Population'...`);
|
||||
this.popCapType = this.CAPTYPE_PLAYER_POPULATION;
|
||||
}
|
||||
if (![this.CAPTYPE_PLAYER_POPULATION, this.CAPTYPE_TEAM_POPULATION, this.CAPTYPE_WORLD_POPULATION].includes(type))
|
||||
error("Invalid population cap type specified: " + type);
|
||||
|
||||
this.popCapType = type;
|
||||
|
||||
if (this.popCap)
|
||||
this.InitializePopCaps();
|
||||
};
|
||||
|
|
@ -48,6 +46,13 @@ PopulationCapManager.prototype.SetPopulationCap = function(cap)
|
|||
this.InitializePopCaps();
|
||||
};
|
||||
|
||||
PopulationCapManager.prototype.SetPerPlayerPopulationCaps = function(playerCaps)
|
||||
{
|
||||
this.perPlayerPopCaps = playerCaps;
|
||||
this.popCapType = this.CAPTYPE_PLAYER_POPULATION;
|
||||
this.InitializePopCaps();
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the current pop cap.
|
||||
* @returns {number}
|
||||
|
|
@ -86,10 +91,10 @@ PopulationCapManager.prototype.InitializePopCaps = function()
|
|||
*/
|
||||
PopulationCapManager.prototype.InitializePlayerPopCaps = function()
|
||||
{
|
||||
const players = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetActivePlayers();
|
||||
for (const player of players)
|
||||
QueryPlayerIDInterface(player, IID_Player)
|
||||
.SetMaxPopulation(this.popCap);
|
||||
const players = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNonGaiaPlayers();
|
||||
for (const i in players)
|
||||
QueryPlayerIDInterface(players[i], IID_Player)
|
||||
.SetMaxPopulation(this.perPlayerPopCaps ? this.perPlayerPopCaps[i] : this.popCap);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ cmpBarter.priceDifferences = { "wood": 0, "stone": 0, "metal": 0 };
|
|||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_EQUALS(cmpBarter.restoreTimer, 7);
|
||||
TS_ASSERT(timerActivated);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL, "stone": cmpBarter.DIFFERENCE_PER_DEAL, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "stone": cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(sold, 100);
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE + 0) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 0)));
|
||||
|
||||
|
|
@ -125,12 +125,12 @@ TS_ASSERT_EQUALS(bought, 0);
|
|||
|
||||
cmpBarter.priceDifferences = { "wood": 0, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 };
|
||||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE + 0) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 99 - cmpBarter.CONSTANT_DIFFERENCE)));
|
||||
|
||||
cmpBarter.priceDifferences = { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": 0, "metal": 0 };
|
||||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": cmpBarter.DIFFERENCE_PER_DEAL, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE - 99 + cmpBarter.CONSTANT_DIFFERENCE) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 0)));
|
||||
|
||||
cmpBarter.priceDifferences = { "wood": 0, "stone": 0, "metal": 0 };
|
||||
|
|
|
|||
|
|
@ -11,5 +11,5 @@
|
|||
],
|
||||
"auraName": "Terror Cimbricus",
|
||||
"auraDescription": "Enemy Soldiers, Ships, Siege, and Structures -20 meters vision range.",
|
||||
"overlayIcon": "art/textures/ui/session/auras/speed_bonus.png"
|
||||
}
|
||||
"overlayIcon": "art/textures/ui/session/auras/fear.png"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@
|
|||
"CivBonuses": [
|
||||
{
|
||||
"Name": "Seeresses",
|
||||
"History": "Seeresses accompanied the German armies and envisioned prophecies of victory from sacrifices.",
|
||||
"Description": "Germans can access a Champion Healer unit in City Phase."
|
||||
"History": "Seeresses accompanied the Germanic armies and envisioned prophecies of victory from sacrifices.",
|
||||
"Description": "A unique Champion Healer unit is available in City Phase."
|
||||
}
|
||||
],
|
||||
"WallSets":
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
"description": "Hire servants to help quarry stone. Increases stone gathering rates.",
|
||||
"requirements": {
|
||||
"all": [
|
||||
{ "tech": "phase_village" }
|
||||
{ "tech": "phase_village" },
|
||||
{ "civ": "cart" }
|
||||
]
|
||||
},
|
||||
"icon": "mining_stone_01.png",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
"description": "Hire servants to help quarry stone. Increases stone gathering rates.",
|
||||
"requirements": {
|
||||
"all": [
|
||||
{ "tech": "phase_town" }
|
||||
{ "tech": "phase_town" },
|
||||
{ "civ": "cart"}
|
||||
]
|
||||
},
|
||||
"icon": "mining_stone_02.png",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
"description": "Hire servants to help quarry stone. Increases stone gathering rates.",
|
||||
"requirements": {
|
||||
"all": [
|
||||
{ "tech": "phase_city" }
|
||||
{ "tech": "phase_city" },
|
||||
{ "civ": "cart"}
|
||||
]
|
||||
},
|
||||
"icon": "mining_stone_03.png",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"genericName": "Bovine Tradition",
|
||||
"autoResearch": true,
|
||||
"description": "German convoys brought livestock, in particular cattle, and placed great importance on these animals for religious sacrifices.",
|
||||
"description": "Germanic convoys brought livestock, in particular cattle, and placed great importance on these animals for religious sacrifices.",
|
||||
"requirements": { "civ": "germ" },
|
||||
"icon": "meat.png",
|
||||
"tooltip": "Civilians +100% meat gather rate.",
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
{ "notciv": "brit" },
|
||||
{ "notciv": "cart" },
|
||||
{ "notciv": "gaul" },
|
||||
{ "notciv": "germ" },
|
||||
{ "notciv": "han" },
|
||||
{ "notciv": "iber" },
|
||||
{ "notciv": "mace" },
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue