aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/army/army2.txtbin21528 -> 0 bytes
-rw-r--r--build/content/armor.txt189
-rw-r--r--build/content/augments.txt264
-rw-r--r--build/content/autolevel.py28
-rw-r--r--build/content/batteries.txt113
-rw-r--r--build/content/brains.txt50
-rw-r--r--build/content/chassis.txt731
-rw-r--r--build/content/gf.bmpbin37978 -> 37978 bytes
-rw-r--r--build/content/gfsmall.bmp (renamed from build/army/army.txt)bin21528 -> 18826 bytes
-rw-r--r--build/content/weapons.txt934
-rw-r--r--build/test.exebin746614 -> 751250 bytes
-rw-r--r--design/notes.txt86
-rw-r--r--gst/gst.c1
-rw-r--r--gst/info.c487
-rw-r--r--gst/info.h76
-rw-r--r--gst/units.c21
-rw-r--r--gst/units.h1
-rw-r--r--hud/hud.c49
-rw-r--r--hud/hud_views.c79
-rw-r--r--hud/hud_views.h20
-rw-r--r--json/jsonparse.c122
-rw-r--r--json/jsonparse.h19
-rw-r--r--main.c16
-rw-r--r--render/render_text.c17
-rw-r--r--render/render_text.h3
25 files changed, 2546 insertions, 760 deletions
diff --git a/build/army/army2.txt b/build/army/army2.txt
deleted file mode 100644
index ae1c3b5..0000000
--- a/build/army/army2.txt
+++ /dev/null
Binary files differ
diff --git a/build/content/armor.txt b/build/content/armor.txt
index f418779..5182a0c 100644
--- a/build/content/armor.txt
+++ b/build/content/armor.txt
@@ -1,57 +1,200 @@
[
{
"name": "metal plating",
- "weight": "50",
- "pierce": "5", "spread": "8"
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "pierce": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "spread": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "heavy metal plating",
- "weight": "80",
- "pierce": "7", "spread": "10", "impact": "5"
+ "weight": [
+ 80.0,
+ 80.0,
+ 80.0
+ ],
+ "pierce": [
+ 7.0,
+ 7.0,
+ 7.0
+ ],
+ "spread": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "impact": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "reflective plating",
- "weight": "40",
- "laser": "10"
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "laser": [
+ 10.0,
+ 10.0,
+ 10.0
+ ]
},
{
"name": "heat resistent plating",
- "weight": "50",
- "fusion": "8"
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "fusion": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "padding",
- "weight": "20",
- "spread": "5", "impact": "8"
+ "weight": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "spread": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "impact": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "reactive armor",
- "weight": "75",
- "explosive": "12"
+ "weight": [
+ 75.0,
+ 75.0,
+ 75.0
+ ],
+ "explosive": [
+ 12.0,
+ 12.0,
+ 12.0
+ ]
},
{
"name": "energy shields",
- "weight": "25",
- "pierce": "3", "spread": "3", "fusion": "3", "explosive": "3", "laser": "3"
+ "weight": [
+ 25.0,
+ 25.0,
+ 25.0
+ ],
+ "pierce": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "spread": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "fusion": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "explosive": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "laser": [
+ 3.0,
+ 3.0,
+ 3.0
+ ]
},
{
"name": "composite armor",
- "weight": "30",
- "pierce": "6", "spread": "4", "impact": "3"
+ "weight": [
+ 30.0,
+ 30.0,
+ 30.0
+ ],
+ "pierce": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "spread": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "impact": [
+ 3.0,
+ 3.0,
+ 3.0
+ ]
},
{
"name": "plastic armor",
- "weight": "10",
- "pierce": "4"
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "pierce": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "sloped steel armor",
- "weight": "45",
- "pierce": "10", "spread": "8"
+ "weight": [
+ 45.0,
+ 45.0,
+ 45.0
+ ],
+ "pierce": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "spread": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "charged armor",
- "weight": "100",
- "explosive": "25"
- },
+ "weight": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "explosive": [
+ 25.0,
+ 25.0,
+ 25.0
+ ]
+ }
] \ No newline at end of file
diff --git a/build/content/augments.txt b/build/content/augments.txt
index c98e1d1..6582a7e 100644
--- a/build/content/augments.txt
+++ b/build/content/augments.txt
@@ -1,97 +1,273 @@
[
{
"name": "charged ammo",
- "weight": "10",
- "damage_emp": "5"
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "damage_emp": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "fusion ammo",
- "weight": "10",
- "damage_fusion": "4"
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "damage_fusion": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "explosive ammo",
- "weight": "30",
- "armor_explosive": "8"
+ "weight": [
+ 30.0,
+ 30.0,
+ 30.0
+ ],
+ "armor_explosive": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "radiator",
- "weight": "10",
- "armor_fusion": "2"
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "armor_fusion": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "priority module",
- "weight": "0"
+ "weight": [
+ 0.0,
+ 0.0,
+ 0.0
+ ]
},
{
"name": "communication array",
- "weight": "50",
- "armor_pierce": "1",
- "armor_impact": "1",
- "armor_fusion": "1",
- "aoe": "2"
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "armor_pierce": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "armor_impact": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "armor_fusion": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "aoe": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "long range targeting",
- "weight": "0",
- "add_range": "1"
+ "weight": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "add_range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "long range targeting",
- "weight": "0",
- "range": "1"
+ "weight": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "fast target acquisition",
- "weight": "5",
- "add_cooldown": "-0.1"
+ "weight": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "add_cooldown": [
+ -0.1,
+ -0.1,
+ -0.1
+ ]
},
{
"name": "overcharger",
- "weight": "10",
- "damage_laser": "8",
- "recharge": "-5"
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "damage_laser": [
+ 8.0,
+ 8.0,
+ 8.0
+ ],
+ "recharge": [
+ -5.0,
+ -5.0,
+ -5.0
+ ]
},
{
"name": "focus lens",
- "weight": "3",
- "damage_laser": "3"
+ "weight": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage_laser": [
+ 3.0,
+ 3.0,
+ 3.0
+ ]
},
{
"name": "amplifier",
- "weight": "30",
- "damage_laser": "3",
- "damage_fusion": "5"
+ "weight": [
+ 30.0,
+ 30.0,
+ 30.0
+ ],
+ "damage_laser": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage_fusion": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "shrapnel",
- "weight": "5",
- "damage_explosive": "5"
+ "weight": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "damage_explosive": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "reloader",
- "weight": "40",
- "add_cooldown": "-0.1"
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "add_cooldown": [
+ -0.1,
+ -0.1,
+ -0.1
+ ]
},
{
"name": "anti jamming device",
- "weight": "2",
- "armor_emp": "5"
+ "weight": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "armor_emp": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "weight stripping",
- "weight": "-10",
- "add_hp": "-10"
+ "weight": [
+ -10.0,
+ -10.0,
+ -10.0
+ ],
+ "add_hp": [
+ -10.0,
+ -10.0,
+ -10.0
+ ]
},
{
"name": "barebone weapon setup",
- "weight": "-30",
- "damage_pierce": "-25",
- "damage_laser": "-25",
- "damage_impact": "-25",
- "damage_fusion": "-25",
- "damage_explosive": "-25",
- "damage_emp": "-25",
- "damage_spread": "-25"
+ "weight": [
+ -30.0,
+ -30.0,
+ -30.0
+ ],
+ "damage_pierce": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_laser": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_impact": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_fusion": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_explosive": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_emp": [
+ -25.0,
+ -25.0,
+ -25.0
+ ],
+ "damage_spread": [
+ -25.0,
+ -25.0,
+ -25.0
+ ]
}
] \ No newline at end of file
diff --git a/build/content/autolevel.py b/build/content/autolevel.py
new file mode 100644
index 0000000..eac6e09
--- /dev/null
+++ b/build/content/autolevel.py
@@ -0,0 +1,28 @@
+import json
+
+def vectorize (obj, forbidlist):
+ for c in obj:
+ for key in c:
+ if not(key in forbidlist):
+ val = c[key]
+ try: val = int(val);
+ except: pass
+ try: val = float(val);
+ except: pass
+ c[key] = [val for i in range(3)]
+ return obj
+
+
+def comp(filename, forbidlist):
+ with open(filename+".txt", "r") as f: obj = json.loads(f.read())
+ obj = vectorize(obj, forbidlist)
+ with open(filename+".txt", "w") as f:
+ f.write(json.dumps(obj, indent=4))
+
+if __name__ == "__main__":
+ #comp("weapons", ["name", "damage_type"])
+ #comp("augments", ["name"])
+ #comp("batteries", ["name"])
+ #comp("armor", ["name"])
+ #comp("chassis", ["name"])
+ comp("brains", ["name"])
diff --git a/build/content/batteries.txt b/build/content/batteries.txt
index fe5da27..18ae48e 100644
--- a/build/content/batteries.txt
+++ b/build/content/batteries.txt
@@ -1,34 +1,131 @@
[
{
"name": "small alkaline pack",
- "weight": "0", "capacity": "50"
+ "weight": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "capacity": [
+ 50.0,
+ 50.0,
+ 50.0
+ ]
},
{
"name": "big alkaline pack",
- "weight": "2", "capacity": "200"
+ "weight": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "capacity": [
+ 200.0,
+ 200.0,
+ 200.0
+ ]
},
{
"name": "small lithium pack",
- "weight": "5", "capacity": "150", "recharge": "1"
+ "weight": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "capacity": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "recharge": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "big lithium pack",
- "weight": "15", "capacity": "500", "recharge": "1"
+ "weight": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "capacity": [
+ 500.0,
+ 500.0,
+ 500.0
+ ],
+ "recharge": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "lead battery",
- "weight": "20", "capacity": "800", "recharge": "1"
+ "weight": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "capacity": [
+ 800.0,
+ 800.0,
+ 800.0
+ ],
+ "recharge": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "small molten salt battery",
- "weight": "40", "capacity": "1500", "recharge": "1"
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "capacity": [
+ 1500.0,
+ 1500.0,
+ 1500.0
+ ],
+ "recharge": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "big molten salt battery",
- "weight": "70", "capacity": "2000", "recharge": "1"
+ "weight": [
+ 70.0,
+ 70.0,
+ 70.0
+ ],
+ "capacity": [
+ 2000.0,
+ 2000.0,
+ 2000.0
+ ],
+ "recharge": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "atomic battery",
- "weight": "150", "capacity": "10000"
+ "weight": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "capacity": [
+ 10000.0,
+ 10000.0,
+ 10000.0
+ ]
}
] \ No newline at end of file
diff --git a/build/content/brains.txt b/build/content/brains.txt
index c9bb4b5..87d8d10 100644
--- a/build/content/brains.txt
+++ b/build/content/brains.txt
@@ -1,20 +1,50 @@
[
{
- "name": "search and destroy"
+ "name": "search and destroy",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
- {
- "name": "follower"
+ {
+ "name": "follower",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
- {
- "name": "defensive"
+ {
+ "name": "defensive",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
- {
- "name": "kamikaze"
+ {
+ "name": "kamikaze",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
- {
- "name": "run and gun"
+ {
+ "name": "run and gun",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
- "name": "flank"
+ "name": "flank",
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
}
] \ No newline at end of file
diff --git a/build/content/chassis.txt b/build/content/chassis.txt
index e4643c2..5d8db88 100644
--- a/build/content/chassis.txt
+++ b/build/content/chassis.txt
@@ -1,180 +1,669 @@
[
{
"name": "light two legged bot",
- "slot_weapon": "1",
- "slot_armor": "0",
- "slot_aug": "1",
- "weight_max": "20",
- "hp": "100",
- "speed": "1.5"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "slot_aug": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "weight_max": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "hp": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "speed": [
+ 1.5,
+ 1.5,
+ 1.5
+ ],
+ "upkeep": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "heavy two legged bot",
- "slot_weapon": "1",
- "slot_armor": "1",
- "slot_aug": "3",
- "weight_max": "45",
- "hp": "350",
- "speed": "1"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_aug": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "weight_max": [
+ 45.0,
+ 45.0,
+ 45.0
+ ],
+ "hp": [
+ 350.0,
+ 350.0,
+ 350.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "light four legged bot",
- "slot_weapon": "2",
- "slot_armor": "1",
- "slot_aug": "2",
- "weight_max": "50",
- "hp": "400",
- "speed": "1"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "hp": [
+ 400.0,
+ 400.0,
+ 400.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "heavy four legged bot",
- "slot_weapon": "2",
- "slot_armor": "2",
- "slot_aug": "5",
- "weight_max": "150",
- "hp": "1200",
- "speed": "0.67"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_aug": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "weight_max": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "hp": [
+ 1200.0,
+ 1200.0,
+ 1200.0
+ ],
+ "speed": [
+ 0.67,
+ 0.67,
+ 0.67
+ ]
},
{
"name": "light six legged bot",
- "slot_weapon": "2",
- "slot_armor": "2",
- "slot_aug": "3",
- "weight_max": "210",
- "hp": "640",
- "speed": "1"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_aug": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "weight_max": [
+ 210.0,
+ 210.0,
+ 210.0
+ ],
+ "hp": [
+ 640.0,
+ 640.0,
+ 640.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "heavy six legged bot",
- "slot_weapon": "2",
- "slot_armor": "4",
- "slot_aug": "6",
- "weight_max": "300",
- "hp": "1500",
- "speed": "1"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "slot_aug": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "weight_max": [
+ 300.0,
+ 300.0,
+ 300.0
+ ],
+ "hp": [
+ 1500.0,
+ 1500.0,
+ 1500.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "light buggy",
- "slot_weapon": "1",
- "slot_armor": "1",
- "slot_aug": "1",
- "weight_max": "50",
- "hp": "200",
- "speed": "1"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_aug": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "weight_max": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "hp": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "buggy",
- "slot_weapon": "2",
- "slot_armor": "2",
- "slot_aug": "2",
- "weight_max": "150",
- "hp": "400",
- "speed": "1"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "hp": [
+ 400.0,
+ 400.0,
+ 400.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "light wheeled vehicle",
- "slot_weapon": "1",
- "slot_armor": "0",
- "slot_aug": "2",
- "weight_max": "60",
- "hp": "320",
- "speed": "1",
- "recharge": "0.3"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "hp": [
+ 320.0,
+ 320.0,
+ 320.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ 0.3,
+ 0.3,
+ 0.3
+ ]
},
{
"name": "medium wheeled vehicle",
- "slot_weapon": "2",
- "slot_armor": "2",
- "slot_aug": "3",
- "weight_max": "200",
- "hp": "720",
- "speed": "1",
- "recharge": "0.2"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_aug": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "weight_max": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "hp": [
+ 720.0,
+ 720.0,
+ 720.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ 0.2,
+ 0.2,
+ 0.2
+ ]
},
{
"name": "heavy wheeled vehicle",
- "slot_weapon": "2",
- "slot_armor": "4",
- "slot_aug": "4",
- "weight_max": "270",
- "hp": "950",
- "speed": "1",
- "recharge": "0.2"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "slot_aug": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "weight_max": [
+ 270.0,
+ 270.0,
+ 270.0
+ ],
+ "hp": [
+ 950.0,
+ 950.0,
+ 950.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ 0.2,
+ 0.2,
+ 0.2
+ ]
},
{
"name": "light tank",
- "slot_weapon": "1",
- "slot_armor": "3",
- "slot_aug": "2",
- "weight_max": "300",
- "hp": "700",
- "speed": "1",
- "recharge": "0.4"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 300.0,
+ 300.0,
+ 300.0
+ ],
+ "hp": [
+ 700.0,
+ 700.0,
+ 700.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ 0.4,
+ 0.4,
+ 0.4
+ ]
},
{
"name": "medium tank",
- "slot_weapon": "1",
- "slot_armor": "4",
- "slot_aug": "4",
- "weight_max": "400",
- "hp": "1250",
- "speed": "1",
- "recharge": "0.5"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "slot_aug": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "weight_max": [
+ 400.0,
+ 400.0,
+ 400.0
+ ],
+ "hp": [
+ 1250.0,
+ 1250.0,
+ 1250.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ 0.5,
+ 0.5,
+ 0.5
+ ]
},
{
"name": "heavy tank",
- "slot_weapon": "2",
- "slot_armor": "5",
- "slot_aug": "5",
- "weight_max": "450",
- "hp": "1600",
- "speed": "1"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "slot_aug": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "weight_max": [
+ 450.0,
+ 450.0,
+ 450.0
+ ],
+ "hp": [
+ 1600.0,
+ 1600.0,
+ 1600.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "super heavy tank",
- "slot_weapon": "3",
- "slot_armor": "6",
- "slot_aug": "6",
- "weight_max": "500",
- "hp": "2000",
- "speed": "1"
+ "slot_weapon": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "slot_armor": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "slot_aug": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "weight_max": [
+ 500.0,
+ 500.0,
+ 500.0
+ ],
+ "hp": [
+ 2000.0,
+ 2000.0,
+ 2000.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "hovercraft",
- "slot_weapon": "2",
- "slot_armor": "0",
- "slot_aug": "3",
- "weight_max": "40",
- "hp": "300",
- "speed": "1",
- "recharge": "-0.2"
+ "slot_weapon": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "slot_armor": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "slot_aug": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "weight_max": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "hp": [
+ 300.0,
+ 300.0,
+ 300.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "recharge": [
+ -0.2,
+ -0.2,
+ -0.2
+ ]
},
{
"name": "jet floater",
- "slot_weapon": "1",
- "slot_armor": "0",
- "slot_aug": "2",
- "weight_max": "30",
- "hp": "60",
- "speed": "1"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 30.0,
+ 30.0,
+ 30.0
+ ],
+ "hp": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "one wheeler",
- "slot_weapon": "1",
- "slot_armor": "0",
- "slot_aug": "4",
- "weight_max": "15",
- "hp": "40",
- "speed": "1"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "slot_aug": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "weight_max": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "hp": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "armored crawler",
- "slot_weapon": "1",
- "slot_armor": "4",
- "slot_aug": "2",
- "weight_max": "200",
- "hp": "750",
- "speed": "1",
- "recharge": "-0.4"
+ "slot_weapon": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "slot_armor": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "slot_aug": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "weight_max": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "hp": [
+ 750.0,
+ 750.0,
+ 750.0
+ ],
+ "speed": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "upkeep": [
+ 0.4,
+ 0.4,
+ 0.4
+ ]
}
] \ No newline at end of file
diff --git a/build/content/gf.bmp b/build/content/gf.bmp
index 85cd3e2..a3750be 100644
--- a/build/content/gf.bmp
+++ b/build/content/gf.bmp
Binary files differ
diff --git a/build/army/army.txt b/build/content/gfsmall.bmp
index ae1c3b5..211c925 100644
--- a/build/army/army.txt
+++ b/build/content/gfsmall.bmp
Binary files differ
diff --git a/build/content/weapons.txt b/build/content/weapons.txt
index f4b3b2b..8d20804 100644
--- a/build/content/weapons.txt
+++ b/build/content/weapons.txt
@@ -1,192 +1,974 @@
[
{
"name": "smg",
- "damage_type": "pierce", "weight": "10", "cooldown": "1",
- "damage": "10", "range": "4"
+ "damage_type": "pierce",
+ "weight": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "range": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "machinegun",
- "damage_type": "pierce", "weight": "25", "cooldown": "1",
- "damage": "15", "range": "5"
+ "damage_type": "pierce",
+ "weight": [
+ 25.0,
+ 25.0,
+ 25.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "heavy machinegun",
- "damage_type": "pierce", "weight": "40", "cooldown": "1",
- "damage": "20", "range": "5"
+ "damage_type": "pierce",
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "semi autocannon",
- "damage_type": "pierce", "weight": "70", "cooldown": "2",
- "damage": "32", "range": "6"
+ "damage_type": "pierce",
+ "weight": [
+ 70.0,
+ 70.0,
+ 70.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 32.0,
+ 32.0,
+ 32.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "autocannon",
- "damage_type": "pierce", "weight": "100", "cooldown": "1",
- "damage": "40", "range": "6"
+ "damage_type": "pierce",
+ "weight": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "high velocity cannon",
- "damage_type": "pierce", "weight": "120", "cooldown": "4",
- "damage": "250", "range": "7"
+ "damage_type": "pierce",
+ "weight": [
+ 120.0,
+ 120.0,
+ 120.0
+ ],
+ "cooldown": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "damage": [
+ 250.0,
+ 250.0,
+ 250.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ]
},
{
"name": "scrap gun",
- "damage_type": "spread", "weight": "5", "cooldown": "2",
- "damage": "8", "range": "3"
+ "damage_type": "spread",
+ "weight": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 8.0,
+ 8.0,
+ 8.0
+ ],
+ "range": [
+ 3.0,
+ 3.0,
+ 3.0
+ ]
},
{
"name": "burst cannon",
- "damage_type": "spread", "weight": "15", "cooldown": "2",
- "damage": "25", "range": "4"
+ "damage_type": "spread",
+ "weight": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 25.0,
+ 25.0,
+ 25.0
+ ],
+ "range": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "heavy burst cannon",
- "damage_type": "spread", "weight": "30", "cooldown": "2",
- "damage": "40", "range": "5"
+ "damage_type": "spread",
+ "weight": [
+ 30.0,
+ 30.0,
+ 30.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "maul",
- "damage_type": "impact", "weight": "200", "cooldown": "3",
- "damage": "400", "range": "1", "knockback": "2"
+ "damage_type": "impact",
+ "weight": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage": [
+ 400.0,
+ 400.0,
+ 400.0
+ ],
+ "range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "knockback": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "slam",
- "damage_type": "impact", "weight": "0", "cooldown": "1",
- "damage": "6", "range": "1"
+ "damage_type": "impact",
+ "weight": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "warhammer",
- "damage_type": "impact", "weight": "40", "cooldown": "1",
- "damage": "60", "range": "1", "knockback": "1"
+ "damage_type": "impact",
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "knockback": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "rocket",
- "damage_type": "explosive", "weight": "60", "cooldown": "3",
- "damage": "100", "range": "8"
+ "damage_type": "explosive",
+ "weight": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "range": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "rocket swarm",
- "damage_type": "explosive", "weight": "120", "cooldown": "3",
- "damage": "60", "range": "7", "aoe": "2"
+ "damage_type": "explosive",
+ "weight": [
+ 120.0,
+ 120.0,
+ 120.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ],
+ "aoe": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "tactical rocket",
- "damage_type": "explosive", "weight": "160", "cooldown": "1",
- "damage": "100", "range": "8", "aoe": "1"
+ "damage_type": "explosive",
+ "weight": [
+ 160.0,
+ 160.0,
+ 160.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "range": [
+ 8.0,
+ 8.0,
+ 8.0
+ ],
+ "aoe": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "nuclear rocket",
- "damage_type": "explosive", "weight": "200", "cooldown": "6",
- "damage": "300", "range": "9", "aoe": "3"
+ "damage_type": "explosive",
+ "weight": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "cooldown": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "damage": [
+ 300.0,
+ 300.0,
+ 300.0
+ ],
+ "range": [
+ 9.0,
+ 9.0,
+ 9.0
+ ],
+ "aoe": [
+ 3.0,
+ 3.0,
+ 3.0
+ ]
},
{
"name": "light laser",
- "damage_type": "laser", "weight": "20", "cooldown": "1",
- "damage": "8", "range": "5"
+ "damage_type": "laser",
+ "weight": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 8.0,
+ 8.0,
+ 8.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "combined light laser",
- "damage_type": "laser", "weight": "50", "cooldown": "1",
- "damage": "20", "range": "6"
+ "damage_type": "laser",
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 20.0,
+ 20.0,
+ 20.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "heavy laser",
- "damage_type": "laser", "weight": "130", "cooldown": "1",
- "damage": "45", "range": "6"
+ "damage_type": "laser",
+ "weight": [
+ 130.0,
+ 130.0,
+ 130.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 45.0,
+ 45.0,
+ 45.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "combined heavy laser",
- "damage_type": "laser", "weight": "300", "cooldown": "1",
- "damage": "150", "range": "7"
+ "damage_type": "laser",
+ "weight": [
+ 300.0,
+ 300.0,
+ 300.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ]
},
{
"name": "plasma cannon",
- "damage_type": "fusion", "weight": "80", "cooldown": "2",
- "damage": "125", "range": "5"
+ "damage_type": "fusion",
+ "weight": [
+ 80.0,
+ 80.0,
+ 80.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 125.0,
+ 125.0,
+ 125.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "plasma autocannon",
- "damage_type": "fusion", "weight": "170", "cooldown": "1",
- "damage": "110", "range": "5"
+ "damage_type": "fusion",
+ "weight": [
+ 170.0,
+ 170.0,
+ 170.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 110.0,
+ 110.0,
+ 110.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "plasma artillery",
- "damage_type": "fusion", "weight": "200", "cooldown": "3",
- "damage": "100", "range": "7", "aoe": "2"
+ "damage_type": "fusion",
+ "weight": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ],
+ "aoe": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "fusion blade",
- "damage_type": "fusion", "weight": "15", "cooldown": "1",
- "damage": "15", "range": "1"
+ "damage_type": "fusion",
+ "weight": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 15.0,
+ 15.0,
+ 15.0
+ ],
+ "range": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "fusion lance",
- "damage_type": "fusion", "weight": "50", "cooldown": "1",
- "damage": "45", "range": "2"
+ "damage_type": "fusion",
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "damage": [
+ 45.0,
+ 45.0,
+ 45.0
+ ],
+ "range": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "light railgun",
- "damage_type": "impact", "weight": "50", "cooldown": "2",
- "damage": "90", "range": "6"
+ "damage_type": "impact",
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 90.0,
+ 90.0,
+ 90.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "heavy railgun",
- "damage_type": "impact", "weight": "190", "cooldown": "3",
- "damage": "450", "range": "7"
+ "damage_type": "impact",
+ "weight": [
+ 190.0,
+ 190.0,
+ 190.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage": [
+ 450.0,
+ 450.0,
+ 450.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ]
},
{
"name": "supercharged railgun",
- "damage_type": "impact", "weight": "240", "cooldown": "4",
- "damage": "1000", "range": "8"
+ "damage_type": "impact",
+ "weight": [
+ 240.0,
+ 240.0,
+ 240.0
+ ],
+ "cooldown": [
+ 4.0,
+ 4.0,
+ 4.0
+ ],
+ "damage": [
+ 1000.0,
+ 1000.0,
+ 1000.0
+ ],
+ "range": [
+ 8.0,
+ 8.0,
+ 8.0
+ ]
},
{
"name": "discharge beam",
- "damage_type": "emp", "weight": "40", "cooldown": "2",
- "damage_battery": "3", "range": "4"
+ "damage_type": "emp",
+ "weight": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage_battery": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "range": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "haywire beam",
- "damage_type": "emp", "weight": "50", "cooldown": "5",
- "damage": "80", "damage_battery": "5", "range": "6"
+ "damage_type": "emp",
+ "weight": [
+ 50.0,
+ 50.0,
+ 50.0
+ ],
+ "cooldown": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "damage": [
+ 80.0,
+ 80.0,
+ 80.0
+ ],
+ "damage_battery": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "stun beam",
- "damage_type": "emp", "weight": "80", "cooldown": "5",
- "stun": "1", "range": "4"
+ "damage_type": "emp",
+ "weight": [
+ 80.0,
+ 80.0,
+ 80.0
+ ],
+ "cooldown": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "stun": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "range": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "amplified discharge impulse",
- "damage_type": "emp", "weight": "150", "cooldown": "3",
- "damage_battery": "10", "range": "5", "aoe": "1"
+ "damage_type": "emp",
+ "weight": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "cooldown": [
+ 3.0,
+ 3.0,
+ 3.0
+ ],
+ "damage_battery": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "aoe": [
+ 1.0,
+ 1.0,
+ 1.0
+ ]
},
{
"name": "amplified haywire beam",
- "damage_type": "emp", "weight": "120", "cooldown": "5",
- "damage": "200", "damage_battery": "12", "range": "6"
+ "damage_type": "emp",
+ "weight": [
+ 120.0,
+ 120.0,
+ 120.0
+ ],
+ "cooldown": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "damage": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "damage_battery": [
+ 12.0,
+ 12.0,
+ 12.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "amplified stun beam",
- "damage_type": "emp", "weight": "200", "cooldown": "6",
- "stun": "1", "range": "4"
+ "damage_type": "emp",
+ "weight": [
+ 200.0,
+ 200.0,
+ 200.0
+ ],
+ "cooldown": [
+ 6.0,
+ 6.0,
+ 6.0
+ ],
+ "stun": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "range": [
+ 4.0,
+ 4.0,
+ 4.0
+ ]
},
{
"name": "ion cannon",
- "damage_type": "emp", "weight": "75", "cooldown": "2",
- "reduce_fusion": "1", "reduce_laser": "1", "range": "5"
+ "damage_type": "emp",
+ "weight": [
+ 75.0,
+ 75.0,
+ 75.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "reduce_fusion": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "reduce_laser": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "range": [
+ 5.0,
+ 5.0,
+ 5.0
+ ]
},
{
"name": "heavy ion cannon",
- "damage_type": "emp", "weight": "150", "cooldown": "1",
- "reduce_fusion": "1", "reduce_laser": "1", "range": "6"
+ "damage_type": "emp",
+ "weight": [
+ 150.0,
+ 150.0,
+ 150.0
+ ],
+ "cooldown": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "reduce_fusion": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "reduce_laser": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "range": [
+ 6.0,
+ 6.0,
+ 6.0
+ ]
},
{
"name": "explosive charges",
- "damage_type": "explosive", "weight": "5", "cooldown": "10",
- "damage": "100", "range": "0", "aoe": "2"
+ "damage_type": "explosive",
+ "weight": [
+ 5.0,
+ 5.0,
+ 5.0
+ ],
+ "cooldown": [
+ 10.0,
+ 10.0,
+ 10.0
+ ],
+ "damage": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "range": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "aoe": [
+ 2.0,
+ 2.0,
+ 2.0
+ ]
},
{
"name": "javelin",
- "damage_type": "explosive", "weight": "60", "cooldown": "2",
- "damage": "40", "range": "7"
+ "damage_type": "explosive",
+ "weight": [
+ 60.0,
+ 60.0,
+ 60.0
+ ],
+ "cooldown": [
+ 2.0,
+ 2.0,
+ 2.0
+ ],
+ "damage": [
+ 40.0,
+ 40.0,
+ 40.0
+ ],
+ "range": [
+ 7.0,
+ 7.0,
+ 7.0
+ ]
}
] \ No newline at end of file
diff --git a/build/test.exe b/build/test.exe
index ebb5f5e..835c6e6 100644
--- a/build/test.exe
+++ b/build/test.exe
Binary files differ
diff --git a/design/notes.txt b/design/notes.txt
index bace25c..ef2bb25 100644
--- a/design/notes.txt
+++ b/design/notes.txt
@@ -1,47 +1,49 @@
-tasks: (commit number)
-
-[x] implement rm unit (issued on 6, done on 6)
-[x] implement armor calculation (issued on 6, done on 6)
-[x] implement augment calculations (issued on 6, done on 6)
-[x] implement augment hud view (issued on 6, done on 6)
-[ ] implement sound (issued on 6)
-[ ] implement stats hud view (issued on 6)
-[ ] implement battery calculation (issued on 6)
-[ ] implement brain behaviour (issued on 6)
-[ ] implement component levels (issued on 6)
-[ ] implement persistent settings (issued on 6)
-[ ] implement net hud and minilobby (issued on 6)
-[ ] implement army hud view (issued on 6)
-[ ] implement cost function (issued on 6)
-[ ] implement lobby cost constraints (issued on 6)
-[ ] implement edit unit directly (issued on 6)
-[ ] implement naming template and army (issued on 6)
-[ ] implement move animation (issued on 6)
-[ ] implement fire animation (issued on 6)
-[ ] implement explosions (issued on 6)
-[ ] design 3d units (issued on 6)
-[ ] design 3d map tiles (issued on 6)
-[ ] implement 3d units (issued on 6)
-[ ] design component sprites (issued on 6)
+tasks: (date)
+
+[x] implement rm unit (issued on 18:02:21, done on 18:02:21)
+[x] implement armor calculation (issued on 18:02:21, done on 18:02:21)
+[x] implement augment calculations (issued on 18:02:21, done on 18:02:21)
+[x] implement augment hud view (issued on 18:02:21, done on 18:02:21)
+[ ] implement sound (issued on 18:02:21)
+[ ] implement end of battle condition (issued on 19:02:21)
+[ ] implement stats hud view (issued on 18:02:21)
+[x] implement battery calculation (issued on 18:02:21, done on 19:02:21)
+[ ] implement brain behaviour (issued on 18:02:21)
+[ ] implement component levels (issued on 18:02:21)
+[ ] implement persistent settings (issued on 18:02:21)
+[ ] implement net hud and minilobby (issued on 18:02:21)
+[ ] implement army hud view (issued on 18:02:21)
+[ ] implement cost function (issued on 18:02:21)
+[ ] implement lobby cost constraints (issued on 18:02:21)
+[ ] implement edit unit directly (issued on 18:02:21)
+[ ] implement naming template and army (issued on 18:02:21)
+[ ] implement move animation (issued on 18:02:21)
+[ ] implement fire animation (issued on 18:02:21)
+[ ] implement explosions (issued on 18:02:21)
+[ ] design 3d units (issued on 18:02:21)
+[ ] design 3d map tiles (issued on 18:02:21)
+[ ] implement 3d units (issued on 18:02:21)
+[ ] design component sprites (issued on 18:02:21)
bugs:
-[ ] symmetric integration (found on 6)
+[ ] symmetric integration (found on 18:02:21)
(on army movement and fire, equal armies should fair equally)
testing:
-[ ] armor calculations (issued on 6)
+[ ] write test suit (issued on 19:02:21)
+[ ] armor calculations (issued on 18:02:21)
balance:
-[ ] balance components (issued on 6)
+[ ] balance components (issued on 18:02:21)
-view from 6 to the end:
+view from 18:02:21 to the end:
game is make templates, assemble for army, fight other army
multiplayer up to 2 ppl
armies, templates and settings are persistent
@@ -50,6 +52,22 @@ view from 6 to the end:
details:
+implement components level:
+ could do it globally, every level is +5%atk and +10% cost
+ could set each weapon stat as a vector, v[level] is the stat
+ what is max level? 5?
+ work
+ global: just implement the function
+ local: that's #components * #attributes * #levels, n^3 operations
+ both: local weights, worst of both worlds
+ global is a quick solution, but i'm not here to do things quickly, i want to do them good.
+ so local is better, but requires to
+ . revolutionize every json parser
+ . write a lot of numbers
+ . design with a lot more variables in play
+ before writing 10000 numbers i should design, or autogenerate them
+ settled on 3 lvls, autogenerated with python
+
implement rm unit: -> done, paper note solution
implement armor calculation:
@@ -76,4 +94,12 @@ implement stats hud view:
! put them in stats later
implement sound:
- partially done, need sound design \ No newline at end of file
+ partially done, need sound design
+
+implement battery calculations:
+ every component but the battery has an upkeep
+ upkeep gets paid at the end of the turn
+ if no charge: no shooting or moving
+ weapons that drain energy do so (wow, also what?)
+ yellow small text! yay!
+-> done, tested briefely, testing is delayed until i write test suite
diff --git a/gst/gst.c b/gst/gst.c
index 56db22f..09f3c1c 100644
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -78,5 +78,6 @@ void gst_process (gamestate *gst, infos *info, float t) {
gst_get_maparmy(gst, &m, &ar);
army_move(info, ar, m);
army_fire(info, ar, m);
+ army_upkeep(info, ar, m);
}
} \ No newline at end of file
diff --git a/gst/info.c b/gst/info.c
index 82f1550..e442b2c 100644
--- a/gst/info.c
+++ b/gst/info.c
@@ -42,72 +42,125 @@ void info_unit_init (info_unit *u) {
for(int i=0; i<34; u->levels[i] = 0, i++);
}
+float info_unit_get_capacity(infos *info, info_unit *u) {
+ float sum = 0;
+ int lc = u->levels[LEVEL_CHASSIS];
+ for(int i=0; i<16; i++) {
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_capacity[lvl];
+ }
+ }
+ int lvl = u->levels[LEVEL_BATTERY];
+ sum += info->batteries[u->battery].capacity[lvl];
+ return sum;
+}
+
+float info_unit_get_upkeep(infos *info, info_unit *u) {
+ float sum = 0;
+ int lc = u->levels[LEVEL_CHASSIS];
+ int lbr = u->levels[LEVEL_BRAIN];
+ for(int i=0; i<8; i++) {
+ if (u->weapons[i] != -1 && info->chassis[u->chassis].slot_weapon[lc]) {
+ int lvl = u->levels[LEVEL_WEAPONS+i];
+ sum += info->weapons[u->weapons[i]].upkeep[lvl];
+ }
+ if (u->armor[i] != -1 && info->chassis[u->chassis].slot_armor[lc]) {
+ int lvl = u->levels[LEVEL_ARMOR+i];
+ sum += info->armors[u->armor[i]].upkeep[lvl];
+ }
+ }
+ for(int i=0; i<16; i++) {
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].upkeep[lvl];
+ }
+ }
+ sum += info->chassis[u->chassis].upkeep[lc];
+ sum += info->brains[u->brain].upkeep[lbr];
+ return sum;
+}
+
float info_unit_get_weight (infos *info, info_unit *u) {
float sum = 0;
+ int lc = u->levels[LEVEL_CHASSIS];
if (u->battery != -1) {
- sum += info->batteries[u->battery].weight;
+ int lb = u->levels[LEVEL_BATTERY];
+ sum += info->batteries[u->battery].weight[lb];
}
for(int i=0; i<8; i++) {
- if (u->weapons[i] != -1 && i<info->chassis[u->chassis].slot_weapon) {
- sum += info->weapons[u->weapons[i]].weight;
+ if (u->weapons[i] != -1 && i<info->chassis[u->chassis].slot_weapon[lc]) {
+ int lvl = u->levels[LEVEL_WEAPONS+i];
+ sum += info->weapons[u->weapons[i]].weight[lvl];
}
- if (u->armor[i] != -1 && i<info->chassis[u->chassis].slot_armor) {
- sum += info->armors[u->armor[i]].weight;
+ if (u->armor[i] != -1 && i<info->chassis[u->chassis].slot_armor[lc]) {
+ int lvl = u->levels[LEVEL_ARMOR+i];
+ sum += info->armors[u->armor[i]].weight[lvl];
}
}
for(int i=0; i<16; i++) {
if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].weight;
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].weight[lvl];
}
}
return sum;
}
float info_unit_get_dps (infos *info, info_unit *u) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<8; i++) {
- if (u->weapons[i] != -1 && i<info->chassis[u->chassis].slot_weapon) {
+ if (u->weapons[i] != -1 && i<info->chassis[u->chassis].slot_weapon[lc]) {
info_weapon *w = info->weapons+u->weapons[i];
+ int lw = u->levels[LEVEL_WEAPONS+i];
float damage = info_unit_get_damage(info, u, i);
- sum += damage/w->cooldown;
+ sum += damage/w->cooldown[lw];
}
}
return sum;
}
float info_unit_get_health(infos *info, info_unit *u) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_hp;
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_hp[lvl];
}
}
- sum += info->chassis[u->chassis].hp;
+ sum += info->chassis[u->chassis].hp[lc];
return sum;
}
float info_unit_get_speed(infos *info, info_unit *u) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_speed;
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_speed[lvl];
}
}
- sum += info->chassis[u->chassis].speed;
+ sum += info->chassis[u->chassis].speed[lc];
return sum;
}
float info_unit_get_damage (infos *info, info_unit *u, int w) {
+ int lc = u->levels[LEVEL_CHASSIS];
int damage_type = info->weapons[u->weapons[w]].damage_type;
float sum = 0;
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_damage[damage_type];
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_damage[damage_type][lvl];
}
}
float mult = (1 + sum/100.0f);
if (mult < 0) mult = 0;
- float dam = info->weapons[u->weapons[w]].damage * mult;
+ int lw = u->levels[LEVEL_WEAPONS+w];
+ float dam = info->weapons[u->weapons[w]].damage[lw] * mult;
return dam;
}
@@ -123,37 +176,53 @@ float info_unit_get_damage_target (infos *info, info_unit *u, int w,
}
float info_unit_get_cooldown(infos *info, info_unit *u, int w) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_cooldown;
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_cooldown[lvl];
}
}
- sum += info->weapons[u->weapons[w]].cooldown;
+ int lw = u->levels[LEVEL_WEAPONS+w];
+ sum += info->weapons[u->weapons[w]].cooldown[lw];
return sum;
}
float info_unit_get_range(infos *info, info_unit *u, int w) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_range;
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_range[lvl];
}
}
- sum += info->weapons[u->weapons[w]].range;
+ int lw = u->levels[LEVEL_WEAPONS+w];
+ sum += info->weapons[u->weapons[w]].range[lw];
+ return sum;
+}
+
+float info_unit_get_charge_per_shot (infos *info, info_unit *u, int w) {
+ float sum = 0;
+ int lw = u->levels[LEVEL_WEAPONS+w];
+ sum += info->weapons[u->weapons[w]].charge_per_shot[lw];
return sum;
}
float info_unit_get_armor(infos *info, info_unit *u, int d) {
+ int lc = u->levels[LEVEL_CHASSIS];
float sum = 0;
for(int i=0; i<8; i++) {
- if (u->armor[i] != -1 && i<info->chassis[u->chassis].slot_armor) {
- sum += info->armors[u->armor[i]].armor[d];
+ if (u->armor[i] != -1 && i<info->chassis[u->chassis].slot_armor[lc]) {
+ int lvl = u->levels[LEVEL_ARMOR+i];
+ sum += info->armors[u->armor[i]].armor[d][lvl];
}
}
for(int i=0; i<16; i++) {
- if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug) {
- sum += info->augs[u->augs[i]].add_armor[d];
+ if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) {
+ int lvl = u->levels[LEVEL_AUGS+i];
+ sum += info->augs[u->augs[i]].add_armor[d][lvl];
}
}
return sum;
@@ -162,47 +231,77 @@ float info_unit_get_armor(infos *info, info_unit *u, int d) {
void weapon_init (info_weapon *w) {
strcpy(w->name, "nameless");
- w->damage_type = 0;
- w->weight = 0; w->cooldown = 1;
- w->damage = 0; w->range = 0; w->aoe = 0;
- w->knockback = 0; w->stun = 0;
- for (int i=0; i<7; i++) { w->reduce_armor[i]=0; }
+ for (int l=0; l<MAXLEVEL; l++) {
+ w->damage_type = 0;
+ w->weight[l] = 0;
+ w->cooldown[l] = 1;
+ w->damage[l] = 0;
+ w->range[l] = 0;
+ w->aoe[l] = 0;
+ w->knockback[l] = 0;
+ w->stun[l] = 0;
+ for (int i=0; i<7; i++) { w->reduce_armor[i][l]=0; }
+ w->upkeep[l] = 0;
+ w->charge_per_shot[l] = 0;
+ }
}
void chassis_init (info_chassis *c) {
strcpy(c->name, "nameless");
- c->slot_weapon = 0; c->slot_armor = 0; c->slot_aug = 0;
- c->weight_max = 0; c->hp = 0;
+ for (int l=0; l<MAXLEVEL; l++) {
+ c->slot_weapon[l] = 0;
+ c->slot_armor[l] = 0;
+ c->slot_aug[l] = 0;
+ c->weight_max[l] = 0;
+ c->hp[l] = 0;
+ c->upkeep[l] = 0;
+ }
}
void battery_init (info_battery *b) {
strcpy(b->name, "nameless");
- b->weight = 0; b->capacity = 0; b->recharge = 0;
+ for (int l=0; l<MAXLEVEL; l++) {
+ b->weight[l] = 0;
+ b->capacity[l] = 0;
+ b->recharge[l] = 0;
+ }
}
void armor_init (info_armor *a) {
strcpy(a->name, "nameless");
- a->weight = 0;
- for (int i=0; i<7; i++) { a->armor[i]=0; }
+ for (int l=0; l<MAXLEVEL; l++) {
+ a->weight[l] = 0;
+ for (int i=0; i<7; i++) { a->armor[i][l]=0; }
+ a->upkeep[l] = 0;
+ }
}
void aug_init (info_aug *a) {
strcpy(a->name, "nameless");
- a->weight = 0;
- for (int i=0; i<7; i++) { a->add_damage[i]=0; }
- for (int i=0; i<7; i++) { a->add_armor[i]=0; }
- a->add_range = 0;
- a->add_cooldown = 0;
- a->add_speed = 0;
- a->add_hp = 0;
+ for (int l=0; l<MAXLEVEL; l++) {
+ a->weight[l] = 0;
+ for (int i=0; i<7; i++) { a->add_damage[i][l]=0; }
+ for (int i=0; i<7; i++) { a->add_armor[i][l]=0; }
+ a->add_range[l] = 0;
+ a->add_cooldown [l]= 0;
+ a->add_speed[l] = 0;
+ a->add_hp[l] = 0;
+ a->add_capacity[l] = 0;
+ a->upkeep[l] = 0;
+ }
}
void brain_init (info_brain *a) {
strcpy(a->name, "nameless");
+ for (int l=0; l<MAXLEVEL; l++) {
+ a->upkeep[l] = 0;
+ }
}
-void info_unit_parse (char *json, info_unit *u, jsmntok_t *t, int r) {
+void info_unit_parse (char *json, info_unit *u, jsmntok_t *t, int r,
+ infos *info)
+{
info_unit_init(u);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -243,7 +342,9 @@ void info_unit_parse (char *json, info_unit *u, jsmntok_t *t, int r) {
}
}
-void info_weapon_parse (char *json, info_weapon *w, jsmntok_t *t, int r) {
+void info_weapon_parse (char *json, info_weapon *w, jsmntok_t *t, int r,
+ infos *info)
+{
weapon_init(w);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -257,70 +358,57 @@ void info_weapon_parse (char *json, info_weapon *w, jsmntok_t *t, int r) {
w->damage_type = damage_type_map(val);
}
if (strcmp(key, "weight") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->weight = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->weight, t+i+2, rt-1, 'f');
}
if (strcmp(key, "cooldown") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->cooldown = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->cooldown, t+i+2, rt-1, 'f');
}
if (strcmp(key, "damage") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->damage = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->damage, t+i+2, rt-1, 'f');
}
if (strcmp(key, "range") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->range = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->range, t+i+2, rt-1, 'f');
}
if (strcmp(key, "aoe") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->aoe = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->aoe, t+i+2, rt-1, 'f');
}
if (strcmp(key, "knockback") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->knockback = atoi(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->knockback, t+i+2, rt-1, 'i');
}
if (strcmp(key, "damage_battery") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->damage_battery = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->damage_battery, t+i+2, rt-1, 'f');
}
if (strcmp(key, "stun") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->stun = atoi(val);
- }
- if (strcmp(key, "reduce_pierce") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[0] = atof(val);
- }
- if (strcmp(key, "reduce_laser") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[1] = atof(val);
- }
- if (strcmp(key, "reduce_impact") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[2] = atof(val);
- }
- if (strcmp(key, "reduce_fusion") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[3] = atof(val);
- }
- if (strcmp(key, "reduce_explosive") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[4] = atof(val);
- }
- if (strcmp(key, "reduce_emp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[5] = atof(val);
- }
- if (strcmp(key, "reduce_spread") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- w->reduce_armor[6] = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->stun, t+i+2, rt-1, 'i');
+ }
+ for (int h=0; h<7; h++) {
+ char strkey[32]; sprintf(strkey, "reduce_%s",
+ info->damage_types[h]);
+ if (strcmp(key, strkey) == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->reduce_armor[h], t+i+2, rt-1, 'f');
+ break;
+ }
+ }
+ if (strcmp(key, "upkeep") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, w->upkeep, t+i+2, rt-1, 'f');
}
}
}
}
-void info_chassis_parse (char *json, info_chassis *c, jsmntok_t *t, int r) {
+void info_chassis_parse (char *json, info_chassis *c, jsmntok_t *t, int r,
+ infos *info)
+{
chassis_init(c);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -330,34 +418,40 @@ void info_chassis_parse (char *json, info_chassis *c, jsmntok_t *t, int r) {
substr_token(json, c->name, t+i+1);
}
if (strcmp(key, "slot_weapon") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->slot_weapon = atoi(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->slot_weapon, t+i+2, rt-1, 'i');
}
if (strcmp(key, "slot_armor") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->slot_armor = atoi(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->slot_armor, t+i+2, rt-1, 'i');
}
if (strcmp(key, "slot_aug") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->slot_aug = atoi(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->slot_aug, t+i+2, rt-1, 'i');
}
if (strcmp(key, "weight_max") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->weight_max = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->weight_max, t+i+2, rt-1, 'f');
}
if (strcmp(key, "hp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->hp = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->hp, t+i+2, rt-1, 'f');
}
if (strcmp(key, "speed") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- c->speed = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->speed, t+i+2, rt-1, 'f');
+ }
+ if (strcmp(key, "upkeep") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, c->upkeep, t+i+2, rt-1, 'f');
}
}
}
}
-void info_battery_parse (char *json, info_battery *b, jsmntok_t *t, int r) {
+void info_battery_parse (char *json, info_battery *b, jsmntok_t *t, int r,
+ infos *info)
+{
battery_init(b);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -367,22 +461,24 @@ void info_battery_parse (char *json, info_battery *b, jsmntok_t *t, int r) {
substr_token(json, b->name, t+i+1);
}
if (strcmp(key, "weight") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- b->weight = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, b->weight, t+i+2, rt-1, 'f');
}
if (strcmp(key, "capacity") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- b->capacity = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, b->capacity, t+i+2, rt-1, 'f');
}
if (strcmp(key, "recharge") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- b->recharge = atoi(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, b->recharge, t+i+2, rt-1, 'i');
}
}
}
}
-void info_armor_parse (char *json, info_armor *a, jsmntok_t *t, int r) {
+void info_armor_parse (char *json, info_armor *a, jsmntok_t *t, int r,
+ infos *info)
+{
armor_init(a);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -392,42 +488,26 @@ void info_armor_parse (char *json, info_armor *a, jsmntok_t *t, int r) {
substr_token(json, a->name, t+i+1);
}
if (strcmp(key, "weight") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->weight = atof(val);
- }
- if (strcmp(key, "pierce") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[0] = atof(val);
- }
- if (strcmp(key, "laser") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[1] = atof(val);
- }
- if (strcmp(key, "impact") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[2] = atof(val);
- }
- if (strcmp(key, "fusion") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[3] = atof(val);
- }
- if (strcmp(key, "explosive") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[4] = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->weight, t+i+2, rt-1, 'f');
}
- if (strcmp(key, "emp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[5] = atof(val);
+ for (int h=0; h<7; h++) {
+ if (strcmp(key, info->damage_types[h]) == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->armor[h], t+i+2, rt-1, 'f');
+ }
}
- if (strcmp(key, "spread") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->armor[6] = atof(val);
+ if (strcmp(key, "upkeep") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->upkeep, t+i+2, rt-1, 'f');
}
}
}
}
-void info_aug_parse (char *json, info_aug *a, jsmntok_t *t, int r) {
+void info_aug_parse (char *json, info_aug *a, jsmntok_t *t, int r,
+ infos *info)
+{
aug_init(a);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -437,82 +517,54 @@ void info_aug_parse (char *json, info_aug *a, jsmntok_t *t, int r) {
substr_token(json, a->name, t+i+1);
}
if (strcmp(key, "weight") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->weight = atof(val);
- }
- if (strcmp(key, "damage_pierce") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[0] = atof(val);
- }
- if (strcmp(key, "damage_laser") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[1] = atof(val);
- }
- if (strcmp(key, "damage_impact") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[2] = atof(val);
- }
- if (strcmp(key, "damage_fusion") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[3] = atof(val);
- }
- if (strcmp(key, "damage_explosive") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[4] = atof(val);
- }
- if (strcmp(key, "damage_emp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[5] = atof(val);
- }
- if (strcmp(key, "add_spread") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_damage[6] = atof(val);
- }
- if (strcmp(key, "armor_pierce") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[0] = atof(val);
- }
- if (strcmp(key, "armor_laser") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[1] = atof(val);
- }
- if (strcmp(key, "armor_impact") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[2] = atof(val);
- }
- if (strcmp(key, "armor_fusion") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[3] = atof(val);
- }
- if (strcmp(key, "armor_explosive") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[4] = atof(val);
- }
- if (strcmp(key, "armor_emp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[5] = atof(val);
- }
- if (strcmp(key, "armor_spread") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_armor[6] = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->weight, t+i+2, rt-1, 'f');
+ }
+ for (int h=0; h<7; h++) {
+ char strkey[32]; sprintf(strkey, "damage_%s",
+ info->damage_types[h]);
+ if (strcmp(key, strkey) == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_damage[h], t+i+2, rt-1, 'f');
+ break;
+ }
+ }
+ for (int h=0; h<7; h++) {
+ char strkey[32]; sprintf(strkey, "armor_%s",
+ info->damage_types[h]);
+ if (strcmp(key, strkey) == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_armor[h], t+i+2, rt-1, 'f');
+ break;
+ }
}
if (strcmp(key, "add_range") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_range = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_range, t+i+2, rt-1, 'f');
}
if (strcmp(key, "add_cooldown") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_cooldown = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_cooldown, t+i+2, rt-1, 'f');
}
if (strcmp(key, "add_hp") == 0) {
- char val[32]; substr_token(json, val, t+i+1);
- a->add_hp = atof(val);
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_hp, t+i+2, rt-1, 'f');
+ }
+ if (strcmp(key, "add_capacity") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->add_capacity, t+i+2, rt-1, 'f');
+ }
+ if (strcmp(key, "upkeep") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->upkeep, t+i+2, rt-1, 'f');
}
}
}
}
-void info_brain_parse (char *json, info_brain *a, jsmntok_t *t, int r) {
+void info_brain_parse (char *json, info_brain *a, jsmntok_t *t, int r,
+ infos *info)
+{
brain_init(a);
int obj_i = 0, dict_i = -1;
for (int i=0; i<r; i+=2) {
@@ -521,6 +573,10 @@ void info_brain_parse (char *json, info_brain *a, jsmntok_t *t, int r) {
if (strcmp(key, "name") == 0) {
substr_token(json, a->name, t+i+1);
}
+ if (strcmp(key, "upkeep") == 0) {
+ int rt = json_parse_subtokens(json, t, r, i+1);
+ json_parse_array(json, a->upkeep, t+i+2, rt-1, 'f');
+ }
}
}
}
@@ -534,31 +590,38 @@ void info_parse_json (infos *info, char *json, char *obj) {
if (t[i].type == JSMN_OBJECT) {
int rt = json_parse_subtokens(json, t, r, i);
if (strcmp(obj, "template") == 0) {
- info_unit_parse(json, info->templates+index, t+i+1, rt);
+ info_unit_parse(json,
+ info->templates+index, t+i+1, rt, info);
info->templateslen = index+1;
}
if (strcmp(obj, "weapon") == 0) {
- info_weapon_parse(json, info->weapons+index, t+i+1, rt);
+ info_weapon_parse(json,
+ info->weapons+index, t+i+1, rt, info);
info->weaponslen = index+1;
}
if (strcmp(obj, "chassis") == 0) {
- info_chassis_parse(json, info->chassis+index, t+i+1, rt);
+ info_chassis_parse(json,
+ info->chassis+index, t+i+1, rt, info);
info->chassislen = index+1;
}
if (strcmp(obj, "battery") == 0) {
- info_battery_parse(json, info->batteries+index, t+i+1, rt);
+ info_battery_parse(json,
+ info->batteries+index, t+i+1, rt, info);
info->batterieslen = index+1;
}
if (strcmp(obj, "armor") == 0) {
- info_armor_parse(json, info->armors+index, t+i+1, rt);
+ info_armor_parse(json,
+ info->armors+index, t+i+1, rt, info);
info->armorslen = index+1;
}
if (strcmp(obj, "aug") == 0) {
- info_aug_parse(json, info->augs+index, t+i+1, rt);
+ info_aug_parse(json,
+ info->augs+index, t+i+1, rt, info);
info->augslen = index+1;
}
if (strcmp(obj, "brain") == 0) {
- info_brain_parse(json, info->brains+index, t+i+1, rt);
+ info_brain_parse(json,
+ info->brains+index, t+i+1, rt, info);
info->brainslen = index+1;
}
index ++;
diff --git a/gst/info.h b/gst/info.h
index 3ec17f9..8e7fdaf 100644
--- a/gst/info.h
+++ b/gst/info.h
@@ -2,71 +2,86 @@
#define INFO_H
#define MAXTEMPLATES 128
+#define MAXLEVEL 3
#include <stdint.h>
+#define LEVEL_CHASSIS 0
+#define LEVEL_BRAIN 1
+#define LEVEL_BATTERY 2
+#define LEVEL_WEAPONS 3
+#define LEVEL_ARMOR 11
+#define LEVEL_AUGS 19
+
typedef struct {
char name[32];
// indexes of info.*
int8_t chassis;
int8_t brain;
+ int8_t battery;
int8_t weapons[8];
int8_t armor[8];
int8_t augs[16];
- int8_t battery;
- int8_t levels[34];
+ int8_t levels[35];
} info_unit;
typedef struct {
char name[32];
int damage_type;
- float weight;
- float cooldown;
- float damage;
- float range;
- float aoe;
- int knockback;
- float damage_battery;
- int stun;
- float reduce_armor[7];
+ float weight[MAXLEVEL];
+ float cooldown[MAXLEVEL];
+ float damage[MAXLEVEL];
+ float range[MAXLEVEL];
+ float aoe[MAXLEVEL];
+ int knockback[MAXLEVEL];
+ float damage_battery[MAXLEVEL];
+ int stun[MAXLEVEL];
+ float reduce_armor[7][MAXLEVEL];
+ float upkeep[MAXLEVEL];
+ float charge_per_shot[MAXLEVEL];
} info_weapon;
typedef struct {
char name[32];
- int slot_weapon;
- int slot_armor;
- int slot_aug;
- float weight_max;
- float hp;
- float speed;
+ int slot_weapon[MAXLEVEL];
+ int slot_armor[MAXLEVEL];
+ int slot_aug[MAXLEVEL];
+ float weight_max[MAXLEVEL];
+ float hp[MAXLEVEL];
+ float speed[MAXLEVEL];
+ float upkeep[MAXLEVEL];
} info_chassis;
typedef struct {
char name[32];
- float weight;
- float capacity;
- int recharge;
+ float weight[MAXLEVEL];
+ float capacity[MAXLEVEL];
+ int recharge[MAXLEVEL];
} info_battery;
typedef struct {
char name[32];
- float weight;
- float armor[7];
+ float weight[MAXLEVEL];
+ float armor[7][MAXLEVEL];
+ float upkeep[MAXLEVEL];
} info_armor;
typedef struct {
char name[32];
- float weight;
- float add_damage[7];
- float add_armor[7];
- float add_range;
- float add_cooldown;
- float add_speed;
- float add_hp;
+ float weight[MAXLEVEL];
+ float add_damage[7][MAXLEVEL];
+ float add_armor[7][MAXLEVEL];
+ float add_range[MAXLEVEL];
+ float add_cooldown[MAXLEVEL];
+ float add_speed[MAXLEVEL];
+ float add_hp[MAXLEVEL];
+ float add_capacity[MAXLEVEL];
+ float upkeep[MAXLEVEL];
} info_aug;
typedef struct {
char name[32];
+ float upkeep[MAXLEVEL];
} info_brain;
typedef struct {
@@ -88,11 +103,14 @@ typedef struct {
} infos;
void info_unit_init (info_unit *u);
+float info_unit_get_capacity (infos *info, info_unit *u);
+float info_unit_get_upkeep (infos *info, info_unit *u);
float info_unit_get_weight (infos *info, info_unit *u);
float info_unit_get_dps (infos *info, info_unit *u);
float info_unit_get_health(infos *info, info_unit *u);
float info_unit_get_speed(infos *info, info_unit *u);
float info_unit_get_damage(infos *info, info_unit *u, int w);
+float info_unit_get_charge_per_shot(infos *info, info_unit *u, int w);
float info_unit_get_damage_target(infos *info, info_unit *u, int w,
info_unit *t);
float info_unit_get_cooldown(infos *info, info_unit *u, int w);
diff --git a/gst/units.c b/gst/units.c
index 72089f2..dbf177b 100644
--- a/gst/units.c
+++ b/gst/units.c
@@ -36,6 +36,7 @@ void unit_init (infos *info, army *ar, map *m,
u->owner = owner;
u->hp = info_unit_get_health(info, iu);
u->move_points = 0;
+ u->charge = info_unit_get_capacity(info, iu);
for (int i=0; i<8; u->cooldown[i] = 1, i++);
}
@@ -113,6 +114,7 @@ int army_move_step (infos *info, army *ar, map *m) {
unit *u = ar->us+i;
if (u->move_points <= 0) continue;
if (u->hp <= 0) continue;
+ if (u->charge <= 0) continue;
// search target
unit *t[32];
unit_search(info, ar, m, u, t, 100);
@@ -180,7 +182,8 @@ void army_move (infos *info, army *ar, map *m) {
void army_fire (infos *info, army *ar, map *m) {
for (int i=0; i<ar->uslen; i++) {
unit *u = ar->us+i;
- for (int j=0; j<info->chassis[u->info.chassis].slot_weapon; j++) {
+ int lw = u->info.levels[LEVEL_CHASSIS];
+ for (int j=0; j<info->chassis[u->info.chassis].slot_weapon[lw]; j++) {
u->cooldown[j] += 1;
}
}
@@ -189,7 +192,9 @@ void army_fire (infos *info, army *ar, map *m) {
for (int i=0; i<ar->uslen; i++) {
unit *u = ar->us+i;
if (u->hp <= 0) continue;
- for (int j=0; j<info->chassis[u->info.chassis].slot_weapon; j++) {
+ if (u->charge <= 0) continue;
+ int lw = u->info.levels[LEVEL_CHASSIS];
+ for (int j=0; j<info->chassis[u->info.chassis].slot_weapon[lw]; j++) {
if (u->info.weapons[j] == -1) continue;
if (u->cooldown[j] <= 0) continue;
float range = info_unit_get_range(info, &u->info, j);
@@ -200,6 +205,8 @@ void army_fire (infos *info, army *ar, map *m) {
info, &u->info, j, &t[0]->info);
dmgslen++;
u->cooldown[j] -= info_unit_get_cooldown(info, &u->info, j);
+ u->charge -= info_unit_get_charge_per_shot(info, &u->info, j);
+ if (u->charge < 0) u->charge = 0;
}
}
}
@@ -209,4 +216,14 @@ void army_fire (infos *info, army *ar, map *m) {
unit_dead(ar, m, dmgs[i].u);
}
}
+}
+
+void army_upkeep (infos *info, army *ar, map *m) {
+ // battery drain or recharge
+ for (int i=0; i<ar->uslen; i++) {
+ unit *u = ar->us+i;
+ if (u->hp <= 0) continue;
+ u->charge -= info_unit_get_upkeep(info, &u->info);
+ if (u->charge < 0) u->charge = 0;
+ }
} \ No newline at end of file
diff --git a/gst/units.h b/gst/units.h
index 86f7fd7..615eaa7 100644
--- a/gst/units.h
+++ b/gst/units.h
@@ -36,5 +36,6 @@ void army_destory(army *ar);
void army_spawn (army *ar, map *m, unit u);
void army_move (infos *info, army *ar, map *m);
void army_fire (infos *info, army *ar, map *m);
+void army_upkeep (infos *info, army *ar, map *m);
#endif \ No newline at end of file
diff --git a/hud/hud.c b/hud/hud.c
index 383cb01..2c73288 100644
--- a/hud/hud.c
+++ b/hud/hud.c
@@ -115,7 +115,8 @@ int hud_fnu_check (info_unit *u, infos *info) {
if (u->battery == -1) return 2;
if (u->brain == -1) return 3;
float curweight = info_unit_get_weight(info, u);
- float maxweight = info->chassis[u->chassis].weight_max;
+ int chassis_lvl = u->levels[LEVEL_CHASSIS];
+ float maxweight = info->chassis[u->chassis].weight_max[chassis_lvl];
if (curweight > maxweight) { return 4; }
return 0;
}
@@ -272,8 +273,9 @@ void hud_process_form_new_unit (graphic_settings *gs, hud *h, MKb *mkb,
hud_open_sel(gs, h, t, info, &h->fnu.rect_brain);
}
if (h->fnu.uinfo.chassis != -1) {
+ int lc = h->fnu.uinfo.levels[LEVEL_CHASSIS];
for (int i=0;
- i<info->chassis[h->fnu.uinfo.chassis].slot_armor; i++)
+ i<info->chassis[h->fnu.uinfo.chassis].slot_armor[lc]; i++)
{
float possa[2] = {
h->fnu.rect_armor[i].x, h->fnu.rect_armor[i].y };
@@ -285,7 +287,7 @@ void hud_process_form_new_unit (graphic_settings *gs, hud *h, MKb *mkb,
}
}
for (int i=0;
- i<info->chassis[h->fnu.uinfo.chassis].slot_weapon; i++)
+ i<info->chassis[h->fnu.uinfo.chassis].slot_weapon[lc]; i++)
{
float possa[2] = {
h->fnu.rect_weapons[i].x, h->fnu.rect_weapons[i].y };
@@ -297,7 +299,7 @@ void hud_process_form_new_unit (graphic_settings *gs, hud *h, MKb *mkb,
}
}
for (int i=0;
- i<info->chassis[h->fnu.uinfo.chassis].slot_aug; i++)
+ i<info->chassis[h->fnu.uinfo.chassis].slot_aug[lc]; i++)
{
float possa[2] = {
h->fnu.rect_augs[i].x, h->fnu.rect_augs[i].y };
@@ -552,12 +554,12 @@ void hud_render_sel (hud_sel *sc, MKb *mkb, info_unit *u,
SDL_RenderFillRect(rend, &r);
SDL_SetRenderDrawColor(rend, 0, 0, 0, 255);
SDL_RenderDrawRect(rend, &r);
- if (sel==0) render_view_chassis(rend, t, x, y, info, i, sprites);
- if (sel==1) render_view_battery(rend, t, x, y, info, i);
- if (sel==2) render_view_armor_detail(rend, t, x, y, info, i);
- if (sel==3) render_view_weapon_detail(rend, t, x, y, info, i);
- if (sel==4) render_view_aug_detail(rend, t, x, y, info, i);
- if (sel==5) render_view_brain(rend, t, x, y, info, i);
+ if (sel==0) render_view_chassis(rend, t, x, y, info, i, 0, sprites);
+ if (sel==1) render_view_battery(rend, t, x, y, info, i, 0);
+ if (sel==2) render_view_armor_detail(rend, t, x, y, info, i, 0);
+ if (sel==3) render_view_weapon_detail(rend, t, x, y, info, i, 0);
+ if (sel==4) render_view_aug_detail(rend, t, x, y, info, i, 0);
+ if (sel==5) render_view_brain(rend, t, x, y, info, i, 0);
}
SDL_RenderSetClipRect(rend, NULL);
}
@@ -586,33 +588,37 @@ void hud_render_form_new_unit (form_new_unit *fnu, MKb *mkb,
render_view_stats(rend, t, fnu->rect_stats.x, fnu->rect_stats.y,
info, &fnu->uinfo);
+ int lc = fnu->uinfo.levels[LEVEL_CHASSIS];
if (fnu->uinfo.chassis != -1) {
- for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_weapon; i++) {
+ for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_weapon[lc]; i++) {
SDL_SetRenderDrawColor(rend, 200, 100, 255, 255);
SDL_RenderFillRect(rend, fnu->rect_weapons+i);
SDL_SetRenderDrawColor(rend, 0, 0, 0, 255);
SDL_RenderDrawRect(rend, fnu->rect_weapons+i);
render_view_weapon(rend, t,
fnu->rect_weapons[i].x,
- fnu->rect_weapons[i].y, info, fnu->uinfo.weapons[i]);
+ fnu->rect_weapons[i].y, info, fnu->uinfo.weapons[i],
+ fnu->uinfo.levels[LEVEL_WEAPONS+i]);
}
- for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_armor; i++) {
+ for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_armor[lc]; i++) {
SDL_SetRenderDrawColor(rend, 200, 200, 255, 255);
SDL_RenderFillRect(rend, fnu->rect_armor+i);
SDL_SetRenderDrawColor(rend, 0, 0, 0, 255);
SDL_RenderDrawRect(rend, fnu->rect_armor+i);
render_view_armor(rend, t,
fnu->rect_armor[i].x,
- fnu->rect_armor[i].y, info, fnu->uinfo.armor[i]);
+ fnu->rect_armor[i].y, info, fnu->uinfo.armor[i],
+ fnu->uinfo.levels[LEVEL_ARMOR+i]);
}
- for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_aug; i++) {
+ for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_aug[lc]; i++) {
SDL_SetRenderDrawColor(rend, 200, 200, 255, 255);
SDL_RenderFillRect(rend, fnu->rect_augs+i);
SDL_SetRenderDrawColor(rend, 0, 0, 0, 255);
SDL_RenderDrawRect(rend, fnu->rect_augs+i);
render_view_aug(rend, t,
fnu->rect_augs[i].x,
- fnu->rect_augs[i].y, info, fnu->uinfo.augs[i]);
+ fnu->rect_augs[i].y, info, fnu->uinfo.augs[i],
+ fnu->uinfo.levels[LEVEL_AUGS+i]);
}
}
@@ -681,11 +687,14 @@ void hud_render_form_new_unit (form_new_unit *fnu, MKb *mkb,
render_view_chassis(rend, t,
fnu->rect_chassis.x, fnu->rect_chassis.y,
- info, fnu->uinfo.chassis, sprites);
+ info, fnu->uinfo.chassis,
+ fnu->uinfo.levels[LEVEL_CHASSIS], sprites);
render_view_battery(rend, t,
- fnu->rect_battery.x, fnu->rect_battery.y, info, fnu->uinfo.battery);
+ fnu->rect_battery.x, fnu->rect_battery.y, info, fnu->uinfo.battery,
+ fnu->uinfo.levels[LEVEL_BATTERY]);
render_view_brain(rend, t,
- fnu->rect_brain.x, fnu->rect_brain.y, info, fnu->uinfo.brain);
+ fnu->rect_brain.x, fnu->rect_brain.y, info, fnu->uinfo.brain,
+ fnu->uinfo.levels[LEVEL_BRAIN]);
}
void hud_render_overlay_game (overlay_game *og, MKb *mkb,
@@ -708,7 +717,7 @@ void hud_render_overlay_game (overlay_game *og, MKb *mkb,
for (int i=0; i<info->templateslen; i++) {
float x = og->rect_templates.x+5;
float y = og->rect_templates.y+5 + i*20 + 30;
- render_view_template(rend, t, x, y, info, i);
+ render_view_template(rend, t, x, y, info, i, 0);
}
SDL_SetRenderDrawColor(rend, 0, 200, 120, 255);
diff --git a/hud/hud_views.c b/hud/hud_views.c
index 557ff1f..a7237e2 100644
--- a/hud/hud_views.c
+++ b/hud/hud_views.c
@@ -15,7 +15,8 @@ void render_view_stats (SDL_Renderer* rend, txtd *t, int px, int py,
h += 35;
float calcweight = info_unit_get_weight(info, tm);
- float maxweight = info->chassis[tm->chassis].weight_max;
+ float maxweight = info->chassis[tm->chassis].weight_max[
+ tm->levels[LEVEL_CHASSIS]];
float pw[2] = { px+10, py+h };
char sw[64]; sprintf(sw, "WEIGHT: %.0f/%.0f",
calcweight, maxweight);
@@ -55,7 +56,7 @@ void render_view_stats (SDL_Renderer* rend, txtd *t, int px, int py,
}
void render_view_chassis (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int chassis, SDL_Texture *sprites)
+ infos *info, int chassis, int lvl, SDL_Texture *sprites)
{
if (chassis != -1) {
float pname[2] = { px+10, py+10 };
@@ -85,7 +86,7 @@ void render_view_chassis (SDL_Renderer* rend, txtd *t, int px, int py,
}
void render_view_battery (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int batt)
+ infos *info, int batt, int lvl)
{
if (batt != -1) {
float pname[2] = { px+10, py+10 };
@@ -116,7 +117,7 @@ void render_view_battery (SDL_Renderer* rend, txtd *t, int px, int py,
void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int armor)
+ infos *info, int armor, int lvl)
{
if (armor != -1) {
float pname[2] = { px+10, py+10 };
@@ -128,9 +129,9 @@ void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py,
j += strlen(temp);
for (int i=0; i<7; i++) {
if (i<7-1) {
- sprintf(temp, "%.0f, ", info->armors[armor].armor[i]);
+ sprintf(temp, "%.0f, ", info->armors[armor].armor[i][lvl]);
} else {
- sprintf(temp, "%.0f", info->armors[armor].armor[i]);
+ sprintf(temp, "%.0f", info->armors[armor].armor[i][lvl]);
}
strcpy(sa+j, temp);
j += strlen(temp);
@@ -145,7 +146,7 @@ void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py,
}
void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int armor)
+ infos *info, int armor, int lvl)
{
if (armor != -1) {
float pname[2] = { px+10, py+10 };
@@ -153,7 +154,7 @@ void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py,
render_text_scaled(rend, sname, pname, t, 1);
float pweight[2] = { px+10, py+40 };
char sweight[64]; sprintf(sweight, "WEIGHT: %0.0f",
- info->armors[armor].weight);
+ info->armors[armor].weight[lvl]);
render_text_scaled(rend, sweight, pweight, t, 1);
float pred[2] = { px+10, py+60 };
@@ -161,21 +162,21 @@ void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py,
int h=0;
for (int i=0; i<7; i++) {
- if (info->armors[armor].armor[i] < 0.001) continue;
+ if (info->armors[armor].armor[i][lvl] < 0.001) continue;
float pa[2] = { px+10, py+75+h*15 };
char sa[64]; sprintf(sa, "%s: %.1f%",
- info->damage_types[i], info->armors[armor].armor[i]);
+ info->damage_types[i], info->armors[armor].armor[i][lvl]);
render_text_scaled(rend, sa, pa, t, 1);
h++;
}
} else {
- render_view_weapon(rend, t, px, py, info, armor);
+ render_view_weapon(rend, t, px, py, info, armor, lvl);
}
}
void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int weapon)
+ infos *info, int weapon, int lvl)
{
if (weapon != -1) {
float pname[2] = { px+10, py+10 };
@@ -184,7 +185,7 @@ void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py,
render_text_scaled(rend, sname, pname, t, 1);
float pweight[2] = { px+10, py+30 };
char sweight[64]; sprintf(sweight, "WEIGHT: %.0f",
- info->weapons[weapon].weight);
+ info->weapons[weapon].weight[lvl]);
render_text_scaled(rend, sweight, pweight, t, 1);
float ptype[2] = { px+10, py+45 };
char stype[64]; sprintf(stype, "DAMAGE TYPE: %s",
@@ -192,15 +193,15 @@ void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py,
render_text_scaled(rend, stype, ptype, t, 1);
float pdamage[2] = { px+10, py+60 };
char sdamage[64]; sprintf(sdamage, "DAMAGE: %.0f",
- info->weapons[weapon].damage);
+ info->weapons[weapon].damage[lvl]);
render_text_scaled(rend, sdamage, pdamage, t, 1);
float prange[2] = { px+10, py+75 };
char srange[64]; sprintf(srange, "RANGE: %.0f",
- info->weapons[weapon].range);
+ info->weapons[weapon].range[lvl]);
render_text_scaled(rend, srange, prange, t, 1);
float pcool[2] = { px+10, py+90 };
char scool[64]; sprintf(scool, "COOLDOWN: %.0f",
- info->weapons[weapon].cooldown);
+ info->weapons[weapon].cooldown[lvl]);
render_text_scaled(rend, scool, pcool, t, 1);
} else {
float pname[2] = { px+10, py+10 };
@@ -209,7 +210,7 @@ void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py,
}
void render_view_weapon_detail (SDL_Renderer* rend, txtd *t,
- int px, int py, infos *info, int weapon)
+ int px, int py, infos *info, int weapon, int lvl)
{
if (weapon != -1) {
float pname[2] = { px+10, py+10 };
@@ -218,7 +219,7 @@ void render_view_weapon_detail (SDL_Renderer* rend, txtd *t,
render_text_scaled(rend, sname, pname, t, 1);
float pweight[2] = { px+10, py+30 };
char sweight[64]; sprintf(sweight, "WEIGHT: %.0f",
- info->weapons[weapon].weight);
+ info->weapons[weapon].weight[lvl]);
render_text_scaled(rend, sweight, pweight, t, 1);
float ptype[2] = { px+10, py+45 };
char stype[64]; sprintf(stype, "DAMAGE TYPE: %s",
@@ -226,24 +227,24 @@ void render_view_weapon_detail (SDL_Renderer* rend, txtd *t,
render_text_scaled(rend, stype, ptype, t, 1);
float pdamage[2] = { px+10, py+60 };
char sdamage[64]; sprintf(sdamage, "DAMAGE: %.0f",
- info->weapons[weapon].damage);
+ info->weapons[weapon].damage[lvl]);
render_text_scaled(rend, sdamage, pdamage, t, 1);
float prange[2] = { px+10, py+75 };
char srange[64]; sprintf(srange, "RANGE: %.0f",
- info->weapons[weapon].range);
+ info->weapons[weapon].range[lvl]);
render_text_scaled(rend, srange, prange, t, 1);
float pcool[2] = { px+10, py+90 };
char scool[64]; sprintf(scool, "COOLDOWN: %.0f",
- info->weapons[weapon].cooldown);
+ info->weapons[weapon].cooldown[lvl]);
render_text_scaled(rend, scool, pcool, t, 1);
} else {
- render_view_weapon(rend, t, px, py, info, weapon);
+ render_view_weapon(rend, t, px, py, info, weapon, lvl);
}
}
void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int aug)
+ infos *info, int aug, int lvl)
{
if (aug != -1) {
float pname[2] = { px+10, py+10 };
@@ -252,7 +253,7 @@ void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py,
render_text_scaled(rend, sname, pname, t, 1);
float pweight[2] = { px+10, py+30 };
char sweight[64]; sprintf(sweight, "WEIGHT: %.0f",
- info->augs[aug].weight);
+ info->augs[aug].weight[lvl]);
render_text_scaled(rend, sweight, pweight, t, 1);
} else {
float pname[2] = { px+10, py+10 };
@@ -261,7 +262,7 @@ void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py,
}
void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int aug)
+ infos *info, int aug, int lvl)
{
if (aug != -1) {
float h = 10;
@@ -273,11 +274,11 @@ void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
float pweight[2] = { px+10, py+h };
char sweight[64]; sprintf(sweight, "WEIGHT: %.0f",
- info->augs[aug].weight);
+ info->augs[aug].weight[lvl]);
render_text_scaled(rend, sweight, pweight, t, 1);
h += 15;
- float range = info->augs[aug].add_range;
+ float range = info->augs[aug].add_range[lvl];
if (range != 0) {
float p[2] = { px+10, py+h };
char s[64]; sprintf(s, "RANGE: %.1f", range);
@@ -285,7 +286,7 @@ void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
h += 15;
}
- float cooldown = info->augs[aug].add_cooldown;
+ float cooldown = info->augs[aug].add_cooldown[lvl];
if (cooldown != 0) {
float p[2] = { px+10, py+h };
char s[64]; sprintf(s, "COOLDOWN: %.2f", cooldown);
@@ -293,7 +294,7 @@ void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
h += 15;
}
- float speed = info->augs[aug].add_speed;
+ float speed = info->augs[aug].add_speed[lvl];
if (speed != 0) {
float p[2] = { px+10, py+h };
char s[64]; sprintf(s, "SPEED: %.2f", speed);
@@ -301,7 +302,7 @@ void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
h += 15;
}
- float hp = info->augs[aug].add_hp;
+ float hp = info->augs[aug].add_hp[lvl];
if (hp != 0) {
float p[2] = { px+10, py+h };
char s[64]; sprintf(s, "HP: %.1f", hp);
@@ -312,44 +313,44 @@ void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
h += 5;
float sum = 0;
- for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_armor[i]);
+ for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_armor[i][lvl]);
if (sum != 0) {
float p[2] = { px+10, py+h };
render_text_scaled(rend, "ARMOR: ", p, t, 1);
h += 15;
for (int i=0; i<7; i++) {
- if (info->augs[aug].add_armor[i] == 0) continue;
+ if (info->augs[aug].add_armor[i][lvl] == 0) continue;
float pa[2] = { px+10, py+h };
char sa[64]; sprintf(sa, "%s: %.1f%",
- info->damage_types[i], info->augs[aug].add_armor[i]);
+ info->damage_types[i], info->augs[aug].add_armor[i][lvl]);
render_text_scaled(rend, sa, pa, t, 1);
h += 15;
}
}
sum = 0;
- for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_damage[i]);
+ for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_damage[i][lvl]);
if (sum != 0) {
float p[2] = { px+10, py+h };
render_text_scaled(rend, "DAMAGE: ", p, t, 1);
h += 15;
for (int i=0; i<7; i++) {
- if (info->augs[aug].add_damage[i] == 0) continue;
+ if (info->augs[aug].add_damage[i][lvl] == 0) continue;
float pa[2] = { px+10, py+h };
char sa[64]; sprintf(sa, "%s: %.1f%",
- info->damage_types[i], info->augs[aug].add_damage[i]);
+ info->damage_types[i], info->augs[aug].add_damage[i][lvl]);
render_text_scaled(rend, sa, pa, t, 1);
h += 15;
}
}
} else {
- render_view_aug(rend, t, px, py, info, aug);
+ render_view_aug(rend, t, px, py, info, aug, lvl);
}
}
void render_view_brain (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int brain)
+ infos *info, int brain, int lvl)
{
if (brain != -1) {
float pname[2] = { px+10, py+10 };
@@ -364,7 +365,7 @@ void render_view_brain (SDL_Renderer* rend, txtd *t, int px, int py,
void render_view_template (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int temp)
+ infos *info, int temp, int lvl)
{
button b = { "edit", 4, { px, py } };
render_button(rend, t, &b);
diff --git a/hud/hud_views.h b/hud/hud_views.h
index ceced23..50311d2 100644
--- a/hud/hud_views.h
+++ b/hud/hud_views.h
@@ -16,32 +16,32 @@ void render_view_stats (SDL_Renderer* rend, txtd *t, int px, int py,
void render_view_chassis (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int chassis, SDL_Texture *sprites);
+ infos *info, int chassis, int lvl, SDL_Texture *sprites);
void render_view_battery (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int batt);
+ infos *info, int batt, int lvl);
void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int armor);
+ infos *info, int armor, int lvl);
void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int armor);
+ infos *info, int armor, int lvl);
void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int weapon);
+ infos *info, int weapon, int lvl);
void render_view_weapon_detail (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int weapon);
+ infos *info, int weapon, int lvl);
void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int aug);
+ infos *info, int aug, int lvl);
void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int aug);
+ infos *info, int aug, int lvl);
void render_view_brain (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int brain);
+ infos *info, int brain, int lvl);
void render_view_template (SDL_Renderer* rend, txtd *t, int px, int py,
- infos *info, int temp);
+ infos *info, int temp, int lvl);
#endif \ No newline at end of file
diff --git a/json/jsonparse.c b/json/jsonparse.c
index 6cfae2e..34587b5 100644
--- a/json/jsonparse.c
+++ b/json/jsonparse.c
@@ -22,6 +22,10 @@ void json_parse_array(char *json, void *temp, jsmntok_t *t, int r, char type) {
int8_t *p = (int8_t*)(intptr_t)temp+sizeof(int8_t)*i;
*p = atoi(val);
}
+ if (type == 'f') {
+ float *p = (float*)(intptr_t)temp+sizeof(float)*i;
+ *p = atof(val);
+ }
}
}
}
@@ -35,10 +39,13 @@ void json_dump_array (char *str, void *arr, int len, char type) {
cur = strlen(str);
}
if (type == 'c') {
- printf("%d\n", ((int8_t*)(intptr_t)(arr))[i]);
sprintf(str+cur, "%d", ((int8_t*)(intptr_t)(arr))[i]);
cur = strlen(str);
}
+ if (type == 'f') {
+ sprintf(str+cur, "%f", ((float*)(intptr_t)(arr))[i]);
+ cur = strlen(str);
+ }
if (i < len-1) {
sprintf(str+cur, ", "); cur = strlen(str);
}
@@ -53,115 +60,4 @@ int json_parse_subtokens (char *json, jsmntok_t *t, int r, int i) {
else { break; }
}
return rt;
-}
-
-/* DEPRECATED TRIALS, delete after backup
-// parses a <str, int> pair set with a set of already parsed tokens
-int json_parse_dict_ci_init (char *json,
- pair_ci *dict, jsmntok_t *t, int r) {
- int obj_i = 0, dict_i = -1;
- for (int i=0; i<r; i++) {
- if (t[i].type == JSMN_OBJECT) {
- dict_i ++;
- obj_i = 0;
- }
- if (t[i].type == JSMN_STRING) {
- if (obj_i == 0) {
- substr_token(json, dict[dict_i].key, t+i);
- } else if (obj_i == 1) {
- char ts[13]; substr_token(json, ts, t+i);
- dict[dict_i].i = atoi(ts);
- }
- obj_i++;
- }
- }
- return dict_i+1;
-}
-
-// parses a <str, int> pair set with a set of already parsed tokens
-int json_parse_dict_cf_init (char *json,
- pair_cf *dict, jsmntok_t *t, int r) {
- int obj_i = 0, dict_i = -1;
- for (int i=0; i<r; i++) {
- if (t[i].type == JSMN_OBJECT) {
- dict_i ++;
- obj_i = 0;
- }
- if (t[i].type == JSMN_STRING) {
- if (obj_i == 0) {
- substr_token(json, dict[dict_i].key, t+i);
- } else if (obj_i == 1) {
- char ts[13]; substr_token(json, ts, t+i);
- dict[dict_i].i = atof(ts);
- }
- obj_i++;
- }
- }
- return dict_i+1;
-}
-
-
-// parses a <str, int> pair set
-int json_parse_dict_ci (char *json, pair_ci *dict) {
- jsmn_parser p; jsmn_init(&p);
- jsmntok_t t[MAXTOKENS];
- int r = jsmn_parse(&p, json, strlen(json), t, MAXTOKENS);
- json_parse_dict_ci_init(json, dict, t, r);
-}
-
-// parses a <str, float> pair set
-int json_parse_dict_cf (char *json, pair_cf *dict) {
- jsmn_parser p; jsmn_init(&p);
- jsmntok_t t[MAXTOKENS];
- int r = jsmn_parse(&p, json, strlen(json), t, MAXTOKENS);
- json_parse_dict_cf_init(json, dict, t, r);
-}
-
-
-
-// parses a list of objects which are lists of pairs <str, int>
-int json_parse_list_ci (char *json, list_ci *list) {
- jsmn_parser p; jsmn_init(&p);
- jsmntok_t t[MAXTOKENS];
- int r = jsmn_parse(&p, json, strlen(json), t, MAXTOKENS);
- int list_i = 0;
- for (int i=1; i<r; i++) { // i=1: ignore outer []
- if (t[i].type == JSMN_ARRAY) {
- int rt = 0;
- for (int j=i; j<r; j++) {
- if (t[j].start < t[i].end) { rt ++; }
- else { break; }
- }
- int len = json_parse_dict_ci_init(
- json, list[list_i].pairs, t+i, rt);
- list[list_i].len = len;
- list_i ++;
- i += rt-1;
- }
- }
- return list_i;
-}
-
-// parses a list of objects which are lists of pairs <str, float>
-int json_parse_list_cf (char *json, list_cf *list) {
- jsmn_parser p; jsmn_init(&p);
- jsmntok_t t[MAXTOKENS];
- int r = jsmn_parse(&p, json, strlen(json), t, MAXTOKENS);
- int list_i = 0;
- for (int i=1; i<r; i++) { // i=1: ignore outer []
- if (t[i].type == JSMN_ARRAY) {
- int rt = 0;
- for (int j=i; j<r; j++) {
- if (t[j].start < t[i].end) { rt ++; }
- else { break; }
- }
- int len = json_parse_dict_cf_init(
- json, list[list_i].pairs, t+i, rt);
- list[list_i].len = len;
- list_i ++;
- i += rt-1;
- }
- }
- return list_i;
-}
-*/ \ No newline at end of file
+} \ No newline at end of file
diff --git a/json/jsonparse.h b/json/jsonparse.h
index 2186154..87a8960 100644
--- a/json/jsonparse.h
+++ b/json/jsonparse.h
@@ -12,24 +12,5 @@ void json_parse_array(char *json, void *temp, jsmntok_t *t, int r, char type);
void json_dump_array (char *str, void *arr, int len, char type);
int json_parse_subtokens (char *json, jsmntok_t *t, int r, int i);
-/*
-typedef struct { char key[32]; int i; } pair_ci;
-typedef struct { char key[32]; float i; } pair_cf;
-
-
-int json_parse_dict_ci_init (char *json, pair_ci *dict, jsmntok_t *t, int r);
-int json_parse_dict_cf_init (char *json, pair_cf *dict, jsmntok_t *t, int r);
-int json_parse_dict_ci (char *json, pair_ci *dict);
-int json_parse_dict_cf (char *json, pair_cf *dict);
-
-#define MAXLISTLEN 64
-#define MAXOBJLEN 32
-
-typedef struct { pair_ci pairs[MAXOBJLEN]; int len; } list_ci;
-typedef struct { pair_cf pairs[MAXOBJLEN]; int len; } list_cf;
-
-int json_parse_list_ci (char *json, list_ci *list);
-int json_parse_list_cf (char *json, list_cf *list);
-*/
#endif \ No newline at end of file
diff --git a/main.c b/main.c
index 2e92bc1..eb8e458 100644
--- a/main.c
+++ b/main.c
@@ -50,6 +50,11 @@ int main( int argc, char* args[] ) {
txtd textd; char_width_init(textd.cw);
SDL_Surface* image = SDL_LoadBMP("content/gf.bmp");
textd.tex = SDL_CreateTextureFromSurface(rend, image);
+ SDL_SetTextureColorMod(textd.tex, 0, 0, 0);
+
+ SDL_Surface* imagesmall = SDL_LoadBMP("content/gfsmall.bmp");
+ SDL_Texture* txsmall = SDL_CreateTextureFromSurface(rend, imagesmall);
+ SDL_SetTextureColorMod(txsmall, 0, 0, 0);
SDL_Surface* sprites = SDL_LoadBMP("content/sprites.bmp");
SDL_Texture* txsprites = SDL_CreateTextureFromSurface(rend, sprites);
@@ -200,14 +205,21 @@ int main( int argc, char* args[] ) {
/ info_unit_get_health(&info, &ar->us[i].info);
SDL_Rect hprect = {
(int)x-posx, (int)y-posy+ts-5,
- ts*amt, 5 };
+ ts*amt, 6 };
int sw = 1 ? ar->us[i].owner : 0;
SDL_SetRenderDrawColor(rend, 255*sw, 255*(1-sw), 0, 255);
SDL_RenderFillRect(rend, &hprect);
+ SDL_SetTextureColorMod(txsmall, 0, 100, 0);
char shp[32]; sprintf(shp, "%.0f", ar->us[i].hp);
float php[2] = { (int)x-posx, (int)y-posy+ts-5 };
- render_text_scaled(rend, shp, php, &textd, 1);
+ render_text_small(rend, shp, php, txsmall);
+
+ SDL_SetTextureColorMod(txsmall, 255, 160, 0);
+ char sch[32]; sprintf(sch, "%.0f", ar->us[i].charge);
+ float pch[2] = { (int)x-posx, (int)y-posy+ts+1 };
+ render_text_small(rend, sch, pch, txsmall);
+ SDL_SetTextureColorMod(txsmall, 0, 0, 0);
}
hud_render(&_hud, rend, &textd, &mkb, &info, txsprites);
diff --git a/render/render_text.c b/render/render_text.c
index 67a13e2..df9317c 100644
--- a/render/render_text.c
+++ b/render/render_text.c
@@ -34,7 +34,7 @@ void render_text (SDL_Renderer* gRenderer, char str[], float off[], txtd *t)
}
}
-void render_text_scaled (SDL_Renderer* gRenderer, char str[],
+void render_text_scaled (SDL_Renderer* rend, char str[],
float off[], txtd *t, float scale)
{
int width = 0;
@@ -42,7 +42,20 @@ void render_text_scaled (SDL_Renderer* gRenderer, char str[],
int char_i = str[i];
SDL_Rect srcRect = { (char_i%32)*6+1, (char_i/32)*12+1, 5, 11 };
SDL_Rect dstRect = { off[0]+width, off[1], 5*scale, 11*scale };
- SDL_RenderCopy(gRenderer, t->tex, &srcRect, &dstRect);
+ SDL_RenderCopy(rend, t->tex, &srcRect, &dstRect);
width += t->cw[char_i]*scale+1*scale;
}
+}
+
+void render_text_small (SDL_Renderer* rend, char str[], float off[],
+ SDL_Texture *texsmall)
+{
+ int width = 0;
+ for (int i=0; str[i]!='\0'; i++) {
+ int char_i = str[i];
+ SDL_Rect srcRect = { (char_i%32)*5+1, (char_i/32)*7+1, 4, 6 };
+ SDL_Rect dstRect = { off[0]+width, off[1], 4, 6 };
+ SDL_RenderCopy(rend, texsmall, &srcRect, &dstRect);
+ width += 5;
+ }
} \ No newline at end of file
diff --git a/render/render_text.h b/render/render_text.h
index e7474ff..a9e952e 100644
--- a/render/render_text.h
+++ b/render/render_text.h
@@ -15,4 +15,7 @@ void render_text (SDL_Renderer* gRenderer, char str[], float off[], txtd *t);
void render_text_scaled (SDL_Renderer* gRenderer, char str[],
float off[], txtd *t, float scale);
+void render_text_small (SDL_Renderer* rend, char str[], float off[],
+ SDL_Texture *texsmall);
+
#endif \ No newline at end of file