Phase C: weapons, combat units (spinner/stacktank/basscannon/roadie), mastering studio, conquest victory

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-20 04:32:26 +10:00
parent 71879139c2
commit 19fcb7c525
21 changed files with 259 additions and 2 deletions

View File

@ -16,3 +16,19 @@ Cursors:
Start: 0
deploy-blocked:
Start: 0
goldwrench:
Start: 0
goldwrench-blocked:
Start: 0
attack:
Start: 0
attackoutsiderange:
Start: 0
attackmove:
Start: 0
attackmove-blocked:
Start: 0
assaultmove:
Start: 0
assaultmove-blocked:
Start: 0

View File

@ -33,3 +33,15 @@ actor-garage =
.name = Garage
actor-djgrunt =
.name = DJ
## combat.yaml
actor-spinner =
.name = Spinner
actor-stacktank =
.name = Stack Walker
actor-basscannon =
.name = Bass Cannon
actor-roadie =
.name = Roadie
actor-mastering =
.name = Mastering Studio

View File

@ -13,6 +13,7 @@ Notifications:
Rules:
vinylgod|rules/vinylgod.yaml
vinylgod|rules/economy.yaml
vinylgod|rules/combat.yaml
vinylgod|rules/mpspawn.yaml
vinylgod|rules/palettes.yaml
vinylgod|rules/player.yaml

View File

@ -0,0 +1,103 @@
^ArmedUnit:
Inherits: ^Unit
AttackFrontal:
FacingTolerance: 80
AutoTarget:
AutoTargetPriority@DEFAULT:
ValidTargets: GroundActor, Structure
AttackMove:
spinner:
Inherits: ^ArmedUnit
Buildable:
Queue: Vehicle
BuildPaletteOrder: 40
Prerequisites: garage
Valued:
Cost: 500
Tooltip:
Name: actor-spinner.name
Health:
HP: 25000
Armor:
Type: Light
Mobile:
Locomotor: wheeled
Speed: 110
Armament:
Weapon: tonearm_blade
stacktank:
Inherits: ^ArmedUnit
Buildable:
Queue: Vehicle
BuildPaletteOrder: 50
Prerequisites: garage, pressplant
Valued:
Cost: 800
Tooltip:
Name: actor-stacktank.name
Health:
HP: 90000
Armor:
Type: Heavy
Mobile:
Locomotor: wheeled
Speed: 50
Armament:
Weapon: feedback_burst
basscannon:
Inherits: ^ArmedUnit
Buildable:
Queue: Vehicle
BuildPaletteOrder: 60
Prerequisites: garage, mastering
Valued:
Cost: 900
Tooltip:
Name: actor-basscannon.name
Health:
HP: 20000
Armor:
Type: Light
Mobile:
Locomotor: wheeled
Speed: 45
Armament:
Weapon: bass_ring
roadie:
Inherits: ^Unit
Buildable:
Queue: Infantry
BuildPaletteOrder: 20
Prerequisites: merchtable
Valued:
Cost: 500
Tooltip:
Name: actor-roadie.name
Health:
HP: 8000
Armor:
Type: None
Mobile:
Locomotor: foot
Speed: 50
InstantlyRepairs:
mastering:
Inherits: ^EconBuilding
Inherits@shape: ^Buildable2x2
Buildable:
Queue: Building
BuildPaletteOrder: 60
Prerequisites: garage
Valued:
Cost: 1500
Tooltip:
Name: actor-mastering.name
Health:
HP: 60000
Power:
Amount: -40

View File

@ -10,6 +10,9 @@
^Unit:
Inherits: ^EconSprite
Targetable:
TargetTypes: GroundActor
MustBeDestroyed:
Selectable:
Bounds: 1024, 1024
RevealsShroud:
@ -67,7 +70,7 @@ popupvan:
Facing: 384
djgrunt:
Inherits: ^Unit
Inherits: ^ArmedUnit
Buildable:
Queue: Infantry
BuildPaletteOrder: 10
@ -83,9 +86,16 @@ djgrunt:
Mobile:
Locomotor: foot
Speed: 56
Armament:
Weapon: seven_inch
^EconBuilding:
Inherits: ^EconSprite
Targetable:
TargetTypes: GroundActor, Structure
MustBeDestroyed:
RequiredForShortGame: true
InstantlyRepairable:
Tooltip:
Health:
HP: 90000

View File

@ -5,6 +5,8 @@
Name: terrain
PaletteFromGrayscale@chrome:
Name: chrome
PaletteFromGrayscale@effect:
Name: effect
PlayerColorPalette@player:
BasePalette: greyscale
PlayerColorShift:

View File

@ -21,6 +21,8 @@ player:
ClassicProductionQueue@Infantry:
Type: Infantry
Group: Infantry
ConquestVictoryConditions:
MissionObjectives:
editorplayer:
Inherits: ^baseplayer

View File

@ -35,6 +35,7 @@ world:
ClassName: options-starting-units.unlabeled
BuildingInfluence:
PathFinder:
MapOptions:
Locomotor@WHEELED:
Name: wheeled
TerrainSpeeds:

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

View File

@ -59,3 +59,33 @@ garage:
Filename: sequences/assets/garage.png
icon:
Filename: sequences/assets/icon_garage.png
spinner:
idle:
Filename: sequences/assets/spinner.png
icon:
Filename: sequences/assets/icon_spinner.png
stacktank:
idle:
Filename: sequences/assets/stacktank.png
icon:
Filename: sequences/assets/icon_stacktank.png
basscannon:
idle:
Filename: sequences/assets/basscannon.png
icon:
Filename: sequences/assets/icon_basscannon.png
roadie:
idle:
Filename: sequences/assets/roadie.png
icon:
Filename: sequences/assets/icon_roadie.png
mastering:
idle:
Filename: sequences/assets/mastering.png
icon:
Filename: sequences/assets/icon_mastering.png

View File

@ -0,0 +1,70 @@
# Placeholder projectiles: invisible bullets, no impact effects until Phase D art lands.
^GroundWeapon:
ValidTargets: GroundActor
Projectile: Bullet
Speed: 682
tonearm_blade:
Inherits: ^GroundWeapon
ReloadDelay: 12
Range: 1c512
Warhead@1Dam: SpreadDamage
Spread: 64
Damage: 900
ValidTargets: GroundActor
Versus:
None: 100
Wood: 45
Light: 60
Heavy: 25
seven_inch:
Inherits: ^GroundWeapon
ReloadDelay: 30
Range: 4c0
Projectile: Bullet
Speed: 512
LaunchAngle: 30
Warhead@1Dam: SpreadDamage
Spread: 96
Damage: 3000
ValidTargets: GroundActor
Versus:
None: 90
Wood: 40
Light: 50
Heavy: 20
feedback_burst:
Inherits: ^GroundWeapon
ReloadDelay: 50
Range: 5c0
Warhead@1Dam: SpreadDamage
Spread: 128
Damage: 5000
ValidTargets: GroundActor
Versus:
None: 40
Wood: 70
Light: 80
Heavy: 100
bass_ring:
Inherits: ^GroundWeapon
ReloadDelay: 120
Range: 9c0
MinRange: 2c0
Projectile: Bullet
Speed: 300
LaunchAngle: 62
Blockable: false
Warhead@1Dam: SpreadDamage
Spread: 341
Damage: 8000
ValidTargets: GroundActor
Versus:
None: 100
Wood: 100
Light: 75
Heavy: 40

View File

@ -86,6 +86,14 @@ box_sprite(os.path.join(OUT, 'merchtable.png'), 32, GREEN, DARK)
box_sprite(os.path.join(OUT, 'garage.png'), 64, BLUE, DARK)
box_sprite(os.path.join(OUT, 'djgrunt.png'), 16, PINK, DARK)
# Phase C: combat roster
RED = (220, 70, 60, 255)
box_sprite(os.path.join(OUT, 'spinner.png'), 20, RED, DARK)
box_sprite(os.path.join(OUT, 'stacktank.png'), 28, DARK, RED)
box_sprite(os.path.join(OUT, 'basscannon.png'), 26, GREY, RED)
box_sprite(os.path.join(OUT, 'roadie.png'), 16, GOLD, DARK)
box_sprite(os.path.join(OUT, 'mastering.png'), 64, (150, 150, 160, 255), PINK)
def icon(path, body):
w, h = 64, 48
@ -99,7 +107,9 @@ def icon(path, body):
for name, col in [('popupshop', GOLD), ('ampstack', GREY), ('pressplant', (255, 45, 150, 255)),
('vault', (70, 65, 75, 255)), ('merchtable', GREEN), ('garage', BLUE),
('digger', PINK), ('popupvan', GOLD), ('djgrunt', (255, 120, 180, 255))]:
('digger', PINK), ('popupvan', GOLD), ('djgrunt', (255, 120, 180, 255)),
('spinner', RED), ('stacktank', (120, 40, 35, 255)), ('basscannon', (160, 90, 85, 255)),
('roadie', GOLD), ('mastering', (150, 150, 160, 255))]:
icon(os.path.join(OUT, f'icon_{name}.png'), col)
# clock overlay for production progress (single frame, semi-transparent)