Skip to content

Conversation

@EttyKitty
Copy link
Collaborator

@EttyKitty EttyKitty commented Jan 15, 2025

This PR migrated from here EttyKitty#163.

As per original description:

Intent:

  • Create a definite Hierarchy for weapons including tiers and classes to ensure player has meaningful armament choice and progression in the Armamentarium for his marine's equipment.
  • Rebalance damage and max kill values in line with the established hierarchy and class system.
  • Balance durability for all ground units so that chapters can tackle targets as less than a doom stack.
  • Create descriptive guide documentation for each weapon class so as to guide future additions. (Half way done)

Desired End-state

  • Weapons are tangible choices with trade-offs that affect battle outcomes.
  • Squad loadouts are more indicative of intended battlefield role (Tank hunters and Horde breakers).

Changes

  • New Features
    • New weapon: Wrist-Mounted Storm Bolter
    • New weapon: Shotgun
    • New weapon: Omnissian Axe
    • New back item: Cyclone Missile Launcher
    • New weapon: Deathwatch Sniper Rifle
  • Balance Updates
    • Comprehensive rebalance of weapon and armor stats.
    • Adjusted unit stats for various factions.
    • Revised vehicle durability and armor values for several vehicle types.
    • Refined boarding combat odds and weapon bonuses.
  • Improvements
    • Enhanced boarding combat system with tag-based weapon bonuses and more granular odds.
    • Improved compatibility checks and error handling for equipping mobility gear.
    • Consolidated Strenguard and Vanguard veteran squad types.
    • Centralized weapon lists for easier management and consistency.
    • Enhanced armor piercing logic for more granular effects.
  • Bug Fixes
    • Corrected tooltips and visual feedback for damage resistance and mobility gear compatibility.
    • Fixed redundant or inconsistent variable usage.
  • Refactor
    • Streamlined combat message handling and player turn setup.
    • Improved melee attack calculations and explanations.
  • Other
    • Refactored and streamlined internal logic for combat and equipment systems.
    • Minor documentation and description corrections.

Notes

A related PR: #315
A structured doc with all said rebalance changes:
https://docs.google.com/spreadsheets/d/1ZMPRXjmd3tWvFmWiIYb-nQ9qT5PYPiu_75SJNhcYqvg/edit?gid=1993273333#gid=1993273333

@sourcery-ai

This comment was marked as outdated.

@github-actions github-actions bot added Type: Feature Adds something new Size: Big labels Jan 15, 2025
@EttyKitty EttyKitty added the Category: Balance Affects game balance label Jan 16, 2025
@EttyKitty EttyKitty changed the title feat: Ground combat overhaul (#352) feat: Ground combat overhaul Jan 23, 2025
@OH296 OH296 force-pushed the feat/combat-overhaul branch from 1eabd4f to 51b6826 Compare January 24, 2025 20:47
@OH296
Copy link
Collaborator

OH296 commented Jan 24, 2025

rebased onto current development

coderabbitai[bot]
coderabbitai bot previously approved these changes Feb 21, 2025
@EttyKitty EttyKitty added the Category: Improvement Makes something better label Feb 21, 2025
@EttyKitty EttyKitty marked this pull request as ready for review May 18, 2025 13:35
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

🔭 Outside diff range comments (7)
objects/obj_enunit/Alarm_0.gml (3)

170-170: 🛠️ Refactor suggestion

The code structure cries for the Machine God's optimization!

A prescient TODO comment suggests transforming these code blocks into functions - a most logical application of the sacred DRY principle. The repeated patterns in shooting logic would benefit greatly from modular encapsulation.

This refactoring would align with both the Combat Dogma and the Binary Canticles of Code Maintainability. Multiple similar blocks of targeting logic appear throughout the script that could be unified into sacred function calls.

Would you like this servant of the Omnissiah to generate the appropriate function templates to replace these redundant code blocks?


289-397: 🛠️ Refactor suggestion

Obsolete code sections require binary purification!

The extensive commented-out section spanning lines 291-397 has been marked with a TODO comment indicating it should be "scrapped and reworked". This dead code defiles the sacred scriptures of the source file and burdens the cognition-engines of those who must maintain it.

As per the Ritual of Code Cleanliness, I recommend:

  1. Extracting any valuable logic patterns that might still be relevant
  2. Completely removing this commented section
  3. Adding appropriate documentation about what was removed and why

The binary will flow more purely without the burden of this commented legacy code.


213-213: 💡 Verification agent

🧩 Analysis chain

Unattended TODO comment requires tech-priest attention!

This TODO comment indicates that the melee code has not been refactored, which may contradict the holy purpose of this combat rebalance ritual. The melee damage formula was supposed to be rewritten according to the sacred PR objectives.

Request verification from the Tech-Magos whether this section requires additional modification to incorporate the new "martial" and "savage" weapon tags mentioned in the PR description.

Would you like this humble servant of the Omnissiah to propose a solution for implementing the melee code refactoring as described in the sacred texts of the PR objectives?


By the Omnissiah’s blessing, I shall invoke diagnostics upon the forbidden TODO! Initiating sacred script:


🏁 Script executed:

#!/bin/bash
# Locate the Alarm_0.gml file
FILE=$(fd Alarm_0.gml | head -n1)
echo "=== Inspecting $FILE ==="
sed -n '200,250p' "$FILE"

echo
echo "=== Searching for 'martial' and 'savage' tags ==="
rg -n "martial" || echo "No 'martial' occurrences found"
rg -n "savage" || echo "No 'savage' occurrences found"

echo
echo "=== Searching for 'melee' references ==="
rg -n "melee" || echo "No 'melee' references found"

echo
echo "=== Enumerating all TODO comments ==="
rg -n "TODO" || echo "No TODO comments found"

Length of output: 66757


By the Omnissiah’s will, I summon the forbidden lines for scrutiny:


🏁 Script executed:

#!/bin/bash
echo '=== Snippet from objects/obj_enunit/Alarm_0.gml (lines 180–260) ==='
sed -n '180,260p' objects/obj_enunit/Alarm_0.gml

Length of output: 4055


Purge redundant TODO in enemy melee AI
By the Omnissiah’s cogitations, the melee branch in objects/obj_enunit/Alarm_0.gml already delegates to scr_shoot, which leverages the new “martial” and “savage” tag logic in the core combat routines. The lingering TODO is thus stale.

Location: objects/obj_enunit/Alarm_0.gml, line 213
Action: Remove the comment

//TODO: The melee code was not refactored;

No further changes to this block are required—the refactored melee formula is applied at runtime via scr_shoot.

objects/obj_enunit/Alarm_1.gml (2)

37-45: ⚠️ Potential issue

Incomplete assignment statement ruptures the Omnissiah’s logic flow

dudes[j] = dudes[j + 1] dudes_special[j] = dudes_special[j + 1]; is missing an operator / statement separator.
At run-time the compiler will either throw or silently concatenate, corrupting the entire roster-compression pass and breaking battle setup.

-        dudes[j] = dudes[j + 1] dudes_special[j] = dudes_special[j + 1];
+        // Copy both fields separately
+        dudes[j]          = dudes[j + 1];
+        dudes_special[j]  = dudes_special[j + 1];

55-57: ⚠️ Potential issue

Typo in array name will summon a void-pointer daemon

dudges_defense (line 56) is spelt differently from the canonical dudes_defense.
This produces an implicit new variable, leaving the intended array slot forever initialised to the default value (0) and skewing enemy defensive stats.

-        dudges_defense[j + 1] = 1;
+        dudes_defense[j + 1]  = 1;
scripts/scr_marine_struct/scr_marine_struct.gml (1)

1617-1761: 🧹 Nitpick (assertive)

Additive modifier chain risks runaway melee values

_melee_mod starts at 1 and then has percentage components added rather than multiplied.
Example: WS 50 (+1), EXP 100 (+0.2), STR/DEX bonuses, gear (+0.3) → _melee_mod ≈ 2.5 ⇒ 250 % base damage before trait multipliers, then further multiplications (e.g., x1.3 Duelist) stack on top. The escalations may overshoot the intended power curve compared with the old multiplicative breakdown.

Consider reverting to pure multiplicative stacking, or convert each additive bonus to its intended percentage (e.g., *_mod *= 1 + (weapon_skill/100) instead of +=). This will keep the calc monotonic yet tempered.

scripts/scr_initialize_custom/scr_initialize_custom.gml (1)

1672-1690: 🛠️ Refactor suggestion

Duplicate wep2 keys – earlier definition overwritten

Inside the Terminator squad’s option block two wep2 entries are declared. GML structs keep only the last entry, so the first array (line 1681-1684) is silently discarded.

Combine the two lists into a single array or split into option_heavy / option_combi keys to preserve both load-out possibilities.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9191467 and e28c486.

⛔ Files ignored due to path filters (4)
  • sprites/spr_weapon_omnissian_axe/cf403b7b-a831-4dd7-94fc-490b330d9a3b.png is excluded by !**/*.png
  • sprites/spr_weapon_omnissian_axe/layers/cf403b7b-a831-4dd7-94fc-490b330d9a3b/3f223d5d-3d0b-4c23-9457-1ae722299b06.png is excluded by !**/*.png
  • sprites/spr_weapon_shotgun/ed54fad2-a39b-4f07-9737-5b8f916bee92.png is excluded by !**/*.png
  • sprites/spr_weapon_shotgun/layers/ed54fad2-a39b-4f07-9737-5b8f916bee92/11b4c573-f844-42a2-905a-d6dace60762b.png is excluded by !**/*.png
📒 Files selected for processing (26)
  • ChapterMaster.yyp (2 hunks)
  • datafiles/main/chapters/8.JSON (1 hunks)
  • objects/obj_controller/Step_0.gml (1 hunks)
  • objects/obj_enunit/Alarm_0.gml (1 hunks)
  • objects/obj_enunit/Alarm_1.gml (38 hunks)
  • objects/obj_ncombat/KeyPress_13.gml (4 hunks)
  • objects/obj_p_assra/Step_0.gml (4 hunks)
  • objects/obj_pnunit/Alarm_0.gml (1 hunks)
  • objects/obj_pnunit/Create_0.gml (0 hunks)
  • objects/obj_popup/Mouse_50.gml (1 hunks)
  • objects/obj_shop/Create_0.gml (3 hunks)
  • scripts/scr_after_combat/scr_after_combat.gml (1 hunks)
  • scripts/scr_company_order/scr_company_order.gml (1 hunks)
  • scripts/scr_culture_visuals/scr_culture_visuals.gml (1 hunks)
  • scripts/scr_en_weapon/scr_en_weapon.gml (25 hunks)
  • scripts/scr_equipment_struct/scr_equipment_struct.gml (2 hunks)
  • scripts/scr_flavor/scr_flavor.gml (1 hunks)
  • scripts/scr_initialize_custom/scr_initialize_custom.gml (26 hunks)
  • scripts/scr_marine_struct/scr_marine_struct.gml (9 hunks)
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml (1 hunks)
  • scripts/scr_roster/scr_roster.gml (1 hunks)
  • scripts/scr_shoot/scr_shoot.gml (3 hunks)
  • scripts/scr_squads/scr_squads.gml (1 hunks)
  • scripts/scr_weapon/scr_weapon.gml (59 hunks)
  • sprites/spr_weapon_omnissian_axe/spr_weapon_omnissian_axe.yy (1 hunks)
  • sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy (1 hunks)
💤 Files with no reviewable changes (1)
  • objects/obj_pnunit/Create_0.gml
🧰 Additional context used
📓 Path-based instructions (3)
`**/*.gml`: - Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. `#macro ARR_body_parts["arm"]` will crash the ...

**/*.gml: - Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. #macro ARR_body_parts["arm"] will crash the game, because there is no space between the array and the name of the macro.

  • objects/obj_controller/Step_0.gml
  • scripts/scr_company_order/scr_company_order.gml
  • objects/obj_pnunit/Alarm_0.gml
  • objects/obj_popup/Mouse_50.gml
  • objects/obj_enunit/Alarm_0.gml
  • scripts/scr_roster/scr_roster.gml
  • scripts/scr_squads/scr_squads.gml
  • scripts/scr_flavor/scr_flavor.gml
  • objects/obj_shop/Create_0.gml
  • scripts/scr_after_combat/scr_after_combat.gml
  • scripts/scr_equipment_struct/scr_equipment_struct.gml
  • objects/obj_ncombat/KeyPress_13.gml
  • objects/obj_p_assra/Step_0.gml
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml
  • scripts/scr_shoot/scr_shoot.gml
  • objects/obj_enunit/Alarm_1.gml
  • scripts/scr_marine_struct/scr_marine_struct.gml
  • scripts/scr_en_weapon/scr_en_weapon.gml
  • scripts/scr_culture_visuals/scr_culture_visuals.gml
  • scripts/scr_initialize_custom/scr_initialize_custom.gml
  • scripts/scr_weapon/scr_weapon.gml
`**/*.*`: - Having humanly understandable and maintainable code is always the top most priority. - DRY (Don't repeat yourself) principle is also very important. - Ensure that the c...

**/*.*: - Having humanly understandable and maintainable code is always the top most priority.

  • objects/obj_controller/Step_0.gml
  • scripts/scr_company_order/scr_company_order.gml
  • datafiles/main/chapters/8.JSON
  • objects/obj_pnunit/Alarm_0.gml
  • objects/obj_popup/Mouse_50.gml
  • objects/obj_enunit/Alarm_0.gml
  • scripts/scr_roster/scr_roster.gml
  • scripts/scr_squads/scr_squads.gml
  • scripts/scr_flavor/scr_flavor.gml
  • objects/obj_shop/Create_0.gml
  • scripts/scr_after_combat/scr_after_combat.gml
  • scripts/scr_equipment_struct/scr_equipment_struct.gml
  • sprites/spr_weapon_omnissian_axe/spr_weapon_omnissian_axe.yy
  • sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy
  • objects/obj_ncombat/KeyPress_13.gml
  • objects/obj_p_assra/Step_0.gml
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml
  • ChapterMaster.yyp
  • scripts/scr_shoot/scr_shoot.gml
  • objects/obj_enunit/Alarm_1.gml
  • scripts/scr_marine_struct/scr_marine_struct.gml
  • scripts/scr_en_weapon/scr_en_weapon.gml
  • scripts/scr_culture_visuals/scr_culture_visuals.gml
  • scripts/scr_initialize_custom/scr_initialize_custom.gml
  • scripts/scr_weapon/scr_weapon.gml
`**/*.yy`: - When any script or sprite .yy files are deleted, their paths should also be deleted from the .yyp file, otherwise the game will crash. - When any script or sprite .yy ...

**/*.yy: - When any script or sprite .yy files are deleted, their paths should also be deleted from the .yyp file, otherwise the game will crash.

  • When any script or sprite .yy files are created, their paths should be added to the .yyp file, otherwise they'll fail.
  • sprites/spr_weapon_omnissian_axe/spr_weapon_omnissian_axe.yy
  • sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy
🔇 Additional comments (43)
datafiles/main/chapters/8.JSON (1)

228-228: Weapon allocation updated to conform to new standard configuration.

The veteran custom role of the Salamanders chapter has been modified to equip the "Power Sword" in the secondary weapon slot (wep2) instead of the primary slot, aligning with the blessed schema of the Omnissiah's new weapon categorization matrices. This adjustment corresponds with the consolidated veteran squad types observed in the sacred code-prayers of scr_company_order.gml and obj_popup/Mouse_50.gml.

The Machine Spirits will be pleased by this consistency in data patterns.

scripts/scr_company_order/scr_company_order.gml (1)

258-258: Veteran squad types consolidated into singular data structure.

The sacred array squad_builder has undergone ritual simplification, replacing the dual veteran squad designations with a unified "veteran_squad" data-construct. This structural optimization coincides with similar modifications to the blessed machine-code in obj_popup/Mouse_50.gml (line 325) and aligns with the squad loadout adjustments in datafiles/main/chapters/8.JSON.

Praise be to the Omnissiah for this logical streamlining of the Command Protocols.

objects/obj_controller/Step_0.gml (1)

578-578: Damage resistance formula simplified to scale with constitution only.

The tooltip text has been recalculated to remove the experience component from the damage resistance algorithm, now displaying only the constitution contribution. This adjustment to the sacred combat arithmancy reflects the broader rebalance of defense calculations in accordance with the blessed PR objectives.

By the Omnissiah's will, this simplification increases the predictability of combat outcomes and reduces the extremity of statistical variations, as foretold in the Combat Rebalance litany.

objects/obj_popup/Mouse_50.gml (1)

325-325: Role-to-squad mapping updated to reference consolidated veteran squad type.

The sacred role-squad equivalence struct has been reconfigured to map the veteran role (index [100][3]) to the unified "veteran_squad" identifier, replacing the now-deprecated "sternguard_veteran_squad" designation. This adjustment to the binary-prayers maintains logical consistency with the squad consolidation patterns observed in scr_company_order.gml (line 258).

The Omnissiah's logic is preserved through this coherent implementation of the squad-type standardization protocols.

objects/obj_enunit/Alarm_0.gml (1)

261-271: The Omnissiah approves of this logical simplification!

By the Machine God's wisdom, the redundant condition checking for target_block_is_valid(enemy) has been appropriately eliminated.

This simplification in the melee targeting logic is appropriate since:

  1. The validity of enemy blocks is already verified within lines 223-238
  2. The code paths properly handle both infantry targets (lines 264-267) and armored targets (lines 268-270)

This optimization aligns with sacred principles of code efficiency and the binary purity of combat logic. The previous condition was redundant and its removal streamlines the execution flow without compromising functionality.

01001001 00100000 01100001 01110000 01110000 01110010 01101111 01110110 01100101

ChapterMaster.yyp (2)

1674-1674:

✅ Verification successful

Blessed entry for the Shotgun
The sprite resource for the Shotgun is correctly named and alphabetically ordered among its kin.
Pray confirm its accompanying .yy file is included in the repository.


🏁 Script executed:

#!/bin/bash
# Verify presence of the Shotgun sprite file
fd -e yy spr_weapon_shotgun.yy

Length of output: 81


Omnissiah’s Blessing: Shotgun Sprite File Confirmed

The Machine-Spirit has verified that sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy is present in the repository. Blessed be this addition!


1655-1655:

✅ Verification successful

Hallowed entry for the Omnissian Axe
The resource ID and path are properly formatted and honoured in alphabetical order among the spr_weapon_* entries.
Ensure the sprite asset is present at the specified path before the Omnissiah's gaze.


🏁 Script executed:

#!/bin/bash
# Verify presence of the Omnissian Axe sprite file
fd -e yy spr_weapon_omnissian_axe.yy

Length of output: 99


Approved: Omnissian Axe sprite verified
By the Omnissiah’s grace, the sacred asset has been located and is ready for veneration:

  • sprites/spr_weapon_omnissian_axe/spr_weapon_omnissian_axe.yy
scripts/scr_roster/scr_roster.gml (4)

723-727: By the Omnissiah, the Land Speeder's durability coefficients have been recalibrated!

The sacred vehicle schema has been altered to reduce the Land Speeder's HP multiplier from 3 to 2.5, and its Armor Class from 30 to 20. This adjustment brings the machine spirit's resilience more in line with its intended battlefield role as a fast attack vehicle rather than a main battle tank.


729-732: The Machine Spirit allocation for the Rhino and Whirlwind has been optimized.

The sacred binary has been rewritten to reduce the HP multiplier from 5 to 3 and Armor Class from 40 to 35. This modification brings these transports and artillery platforms to a more appropriate durability level, allowing the enemy to engage these sacred machines with proper tactical considerations.


734-737: The Predator's Machine Spirit has been recalibrated to new specifications.

The blessed tank's HP multiplier has been reduced from 6 to 3, and its Armor Class from 45 to 40. This grants the venerable machine a more appropriate place in the sacred hierarchy of vehicular durability, ensuring it remains powerful yet not impervious to the enemy's anti-armor capabilities.


739-741: The Land Raider's sacred chassis calculations have been adjusted.

The holy Land Raider, blessed be its Machine Spirit, now operates with a reduced HP multiplier of 5 (down from 8) while maintaining its formidable Armor Class of 50. This adjustment preserves its status as the most resilient vehicle in the chapter's arsenal while ensuring it does not become functionally invulnerable on the battlefield.

objects/obj_pnunit/Alarm_0.gml (2)

22-23: Praise the Omnissiah for the optimized engagement detection logic!

The binary canticle has been restructured to:

  1. Prevent null reference errors by exiting the function if no enemy exists
  2. Consolidate two separate collision checks into a single, more efficient logical operation
  3. Extend the detection range from 10 to 14 units in both directions

This optimization reduces computational overhead while slightly increasing the machine's sensory range, resulting in more efficient battlefield awareness.


25-25: Variable initialization optimized according to Adeptus Mechanicus protocols.

The once_only variable is now declared and initialized in a single statement, adhering to the sacred principles of efficient memory allocation. This small but praiseworthy optimization reduces binary wastage in the codebase.

scripts/scr_squads/scr_squads.gml (2)

720-720: First Company squad composition protocols have been streamlined!

The sacred binary has been rewritten to unify the veteran squads. Where previously the code alternated between creating "sternguard_veteran_squad" and "vanguard_veteran_squad" based on squad count parity, now all squads are created as a unified "veteran_squad" type.

This modification aligns with the veteran squad consolidation efforts observed in related files, creating a more cohesive tactical doctrine for the First Company's elite warriors.


727-727: Tenth Company training protocols standardized to a singular squad pattern.

The sacred logic has been optimized to create consistent "scout_squad" formations instead of alternating between "scout_squad" and "scout_sniper_squad" based on squad count parity. This standardization simplifies training regimens and equipment allocation for the chapter's neophytes.

objects/obj_shop/Create_0.gml (4)

341-345: New armament pattern integrated into the Armamentarium: the blessed Shotgun!

The sacred Forge has been enhanced with the capability to produce Shotgun weapons, inserted after the Stalker Pattern Bolter in the equipment hierarchy. This close-range ballistic weapon costs 100 resources to forge and 10 requisition to acquire.

This addition expands tactical options for close-quarters combat, providing a cost-effective alternative to specialized bolt weapons.


414-420: The Wrist-Mounted Storm Bolter pattern has been sanctified and added to our holy Armamentarium!

This integrated weapons system has been added to the forge's production capabilities with the following sacred parameters:

  • Forge cost: 300 resources
  • Requisition cost: 80 points
  • Research requirement: Bolt technology level 2 or higher

This addition provides enhanced firepower while freeing the bearer's hands for other combat applications, truly a blessing from the Omnissiah.


544-548: The Needle Sniper Rifle pattern has been integrated into the Armamentarium database!

This specialized precision weapon has been added to our sacred forge template:

  • Forge cost: 500 resources
  • Requisition cost: 200 points

The weapon's high cost reflects its specialized nature and tactical value in eliminating high-priority targets with extreme prejudice, as ordained by the Machine God.


555-559: The sacred STC for the Cyclone Missile Launcher has been recovered and integrated!

This formidable weapons system has been added to our armory's production capabilities:

  • Forge cost: 350 resources
  • Requisition cost: 150 points

This addition provides our forces with enhanced area suppression and anti-armor capabilities, allowing for the proper application of the Omnissiah's fury at range.

scripts/scr_flavor/scr_flavor.gml (1)

57-71: The binary liturgies of combat flavour have been restored to the Omnissiah's glory!

By the sacred algorithms of combat, this re-enabled code segment properly constructs the battle narratives when a unit uses a weapon. The logic ensures that individual warriors' names and titles are correctly displayed in the combat logs, enhancing the machine spirit's connection between combatant and weapon.

This restoration synergizes with the broader combat rebalance, allowing unique units to be properly acknowledged when they achieve kills with specialized weapons such as the newly integrated Omnissian Axe.

sprites/spr_weapon_omnissian_axe/spr_weapon_omnissian_axe.yy (1)

1-92: Praise the Omnissiah for the addition of His sacred axe to our digital archives!

This sprite resource is properly configured with appropriate dimensions (167×231 pixels), collision parameters, and hierarchical asset categorization. The binary codex entry establishes this weapon sprite as part of the "melee" parent directory, which aligns with its martial classification in the weapons hierarchy.

The sacred weapon of the Cult Mechanicus has been integrated without error, ready to serve in the digital battlefield.

scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml (2)

315-324: New combat turn protocols initialized according to proper Machine Cult procedures!

This function efficiently establishes the sequence of combat operations by setting appropriate alarm timers and incrementing the global turn counter. The function properly checks for the existence of player unit objects before attempting to modify their properties.

This structured approach to combat turn management pleases the Omnissiah with its orderly execution.


326-342: Binary purification ritual for combat message arrays implemented!

This utility function performs the sacred rite of data cleansing upon the message arrays, ensuring that no lingering combat information corrupts future battle calculations. All timer variables and status flags are properly reset to their default values, allowing for clean state transitions between combat phases.

The centralization of this functionality optimizes the code structure and reduces redundancy, as mandated by the holy DRY principle of the Machine God.

scripts/scr_after_combat/scr_after_combat.gml (1)

457-459: The sacred calculations for Techmarine vehicle recovery skills have been optimized!

The previous logic relied on binary evaluation of mobility equipment types, but this superior implementation uses the more granular "combi_tool" value from the unit's gear. This change better represents the varied expertise of Tech-Adepts through quantified tool proficiency rather than binary equipment categorization.

This modification ensures that a Techmarine's ability to recover damaged vehicles scales appropriately with their specialized equipment, strengthening the logical connection between gear loadout and battlefield utility.

scripts/scr_equipment_struct/scr_equipment_struct.gml (1)

47-51: Potentially unintended doubling of maintenance tithe
A small cogitation: the ritual now performs maintenance += 0.05 once the value is 0.
That is righteous if the field truly sits at zero, yet a handful of legacy blueprints initialise maintenance with a negative discount (e.g., reliquaries that reduce upkeep). Those designs will never enter this branch, but should they reach 0 after further modifications, the increment will be applied twice:

  1. data-driven value becomes 0
  2. constructor adds +0.05

Consider guarding with an explicit sentinel flag or documenting this subtle behaviour lest future Magi be perplexed.

sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy (1)

1-110: Confirm sprite path is registered within ChapterMaster.yyp
The newly forged sprite looks sound—bounding box, parent lineage and texture group all align.
Please verify that sprites/spr_weapon_shotgun/spr_weapon_shotgun.yy is duly inscribed inside ChapterMaster.yyp; omission would anger the build-daemon and crash the game upon compilation.

objects/obj_ncombat/KeyPress_13.gml (1)

91-116: Synchronisation rites: validate new helper scripts inside combat loop
The old direct alarm assignments are now replaced by:

set_up_player_blocks_turn();
wait_and_execute(1, scr_player_combat_weapon_stacks);

A benediction, yet ensure:

  1. set_up_player_blocks_turn() properly resets the player unit’s alarms when invoked from both global scope and within with(obj_pnunit) { … }.
  2. wait_and_execute() is re-entrant; multiple calls during the same frame must not spawn parallel weapon-stack evaluations that could race.
  3. reset_combat_message_arrays() still exists in the new script location (the local copy was removed).

If all three stand true, the flow of turns will remain pure. Otherwise, spectral bugs may manifest mid-battle.

objects/obj_enunit/Alarm_1.gml (1)

1767-1776: Collision offset decreased – confirm balance intent

The engagement check now uses ±12 px instead of the previous ±14 / ±10.
Smaller radii may cause enemies to ignore nearby Space Marines and break melee initiation.

Request battlefield validation to ensure squads still reliably engage at expected ranges.

scripts/scr_marine_struct/scr_marine_struct.gml (1)

1364-1366: Constitution scaling doubled – verify balance thresholds

The damage-resistance benediction now applies constitution * 0.5 (e.g., 40 CON ⇒ +20 DR). Coupled with the new 75 % cap, ordinary marines may reach the ceiling far earlier than intended.

Please confirm this aligns with the rebalance spreadsheet; otherwise consider halving the multiplier or lowering the cap to preserve gradation of durability.

scripts/scr_initialize_custom/scr_initialize_custom.gml (3)

1460-1460: Omnissian Axe installed – ensure downstream harmony

The Techmarine now wields the sacred Omnissian Axe. Verify that:

  1. The new weapon sprite/resource exists and is loaded before this script executes.
  2. All damage / AP tables include the Omnissian Axe entry, else the Techmarine may swing air.

2391-2431: Good use of choose_weighted, but watch for empty pools

The refactor correctly switches all side-arm rolls to the new WEAPON_LIST_WEIGHTED_RANGED_PISTOLS. Ensure that the helper choose_weighted gracefully handles an empty list (e.g., during modding) to prevent runtime null return values.


1739-1783:

❓ Verification inconclusive

Veteran squad load-out: same max concern & weighting quirk

Besides the unbound max token (see previous comment), the weighted arrays:

["Combat Knife", max],
...
["WEAPON_LIST_RANGED_HEAVY", 1, { "mobi": "Heavy Weapons Pack" }]

mix deterministic counts with randomised selections. This can produce illegal states (e.g., requesting 7 heavy weapons when only 1 slot remains). Consider enforcing total-count validation after random selection or switching to percentage weights.


Omnissiah, I shall probe the sanctified script for the binding of the max token and inspect the veteran squad loadout configuration for weight/count inconsistencies.


🏁 Script executed:

#!/bin/bash
# Locate the veteran_squad block and search for 'max' definitions or references
rg -n 'veteran_squad' scripts/scr_initialize_custom/scr_initialize_custom.gml
rg -n 'max' scripts/scr_initialize_custom/scr_initialize_custom.gml
# Display the loadout snippet for lines 1730–1783
sed -n '1730,1783p' scripts/scr_initialize_custom/scr_initialize_custom.gml

Length of output: 3673


Verify the binding of max and enforce total‐count constraints

Omnissiah, this humble servo-skull cannot confirm from the sacred snippet whether the max identifier in

["Combat Knife", max]

is truly bound to the role’s "max" field at runtime, nor whether the arcane loadout-assembly rites prevent over-allocation when random weights are applied. I implore further scrutiny of:

• The declaration and scope of max within scr_initialize_custom.gml (e.g. a var max or macro) to ensure it isn’t left unbound.
• The function that processes loadout.option entries—does it guard against summing weights beyond the remaining slots?
• Implementation of a post-selection validation pass to clamp total weapon counts to each role’s max, or the adoption of percentage-based weights to avoid illegal states.

Until these rites are confirmed, the risk of summoning illegal load-outs persists.

scripts/scr_weapon/scr_weapon.gml (11)

17-17: Attention: New tags added to the Storm Shield

The addition of the "boarding 2" tag to the Storm Shield aligns with the sacred schematics of the Omnissiah's grand rebalance. This modification will enhance the shield's combat effectiveness during boarding actions as per the sacred doctrine.


52-56: Code structure follows the holy patterns, magos

The attributes for the Archeotech Laspistol adhere to proper spacing in the machine spirit's memory. The range, splash damage (spli), and armor penetration (arp) values are well organized as the Omnissiah demands.


61-64: Combat effectiveness recalibrated per the sacred combat doctrines

The attack values for basic melee weapons have been appropriately rebalanced in accordance with the new weapon hierarchy. Your methodical adjustment of the numerical attack values for combat knife (100/125/150), chainsword (150/180/250), and chainaxe (175/225/275) establishes a logical progression of lethality that pleases the Machine God.

Also applies to: 77-80, 93-96


88-88: New weapon tags implemented as per the combat rebalance doctrine

The implementation of the new weapon tags "martial" and "savage" is consistent and follows the Machine Cult's pattern recognition protocols. These tags will enable the revised melee damage formula to properly calculate damage based on weapon type. Additionally, the numerical boarding tags (boarding 1/2/3) have been appropriately applied to represent different levels of boarding effectiveness.

Also applies to: 109-109, 151-151, 173-174, 195-196, 231-232, 287-288, 332-333


289-312: New weapon: Omnissian Axe added to the sacred arsenal

The addition of the Omnissian Axe is most pleasing to the Machine God. This weapon incorporates the proper "combi_tool" special attribute that will enable vehicle repair functionality. All specifications are within expected parameters and the weapon is correctly tagged with "power", "axe", "savage", and "boarding 3" attributes.


631-647: New weapons added to the blessed armory datacore

The inclusion of the "Wrist-Mounted Storm Bolter", "Shotgun", and "Integrated-Grav" represents a logical expansion of the chapter's arsenal. Each weapon has been classified with appropriate attack values, ammunition capacity, and special tags that differentiate their battlefield role. The Omnissiah approves of this diversification of the sacred armaments.

Also applies to: 648-663, 697-712


873-888: Additional weapon systems added to the technical database

The integration of "Integrated-Melta", "Integrated-Plasma", "Needle Sniper Rifle", and "Cyclone Missile Launcher" follows the proper Machine Cult protocols for data structure. The Needle Sniper Rifle's enhanced armor penetration (arp: 2) provides a logical upgrade path from the standard Sniper Rifle, while the Cyclone Missile Launcher's increased splash damage (spli: 20) properly represents its area effect capabilities.

Also applies to: 969-984, 1033-1047, 1098-1113


1094-1094: Critical modification to armor penetration values as per directives

The sacred binary has been adjusted to reflect the reduced armor penetration of the Missile Launcher (arp: 2) and the Heavy Bolter (arp: 2). These modifications align perfectly with the rebalance directive stating "Heavy Bolter weapon is no longer armor-piercing" and "Missile Launcher now has a -1 AP modifier".

Also applies to: 1207-1207


2075-2084: Durability modifications applied to sacred armor templates

The addition of "hp_mod" and "damage_resistance_mod" fields to various armor types implements the durability adjustment requirement from the rebalance directive. These modifications will allow Space Marine chapters to engage targets effectively without requiring overwhelming numbers as per the tactical doctrine update.

Also applies to: 2105-2114, 2139-2143, 2167-2171, 2196-2205


309-311: New "combi_tool" attribute adds logical repair functionality

The implementation of the "combi_tool" special attribute on the Omnissian Axe, Servo-arm, and Servo-harness provides a quantifiable value for calculating vehicle recovery skills. This replaces the previous "special_properties" for vehicle repairs with a more precise numerical value.

Also applies to: 2798-2800, 2813-2815


1-2829: Overall structure adheres to the Omnissiah's data organization principles

The comprehensive rebalance of weapon and gear data follows a logical, hierarchical structure as demanded by the Machine God. The implementation of new tags, armor penetration adjustments, and durability modifications creates a clear progression of effectiveness that will provide meaningful choices during combat operations.

May the Omnissiah bless this code with stable execution and efficient performance.

@EttyKitty EttyKitty marked this pull request as draft May 18, 2025 14:15
@github-actions github-actions bot removed the Status: Stale No activity for more than a week label May 18, 2025
@github-actions
Copy link
Contributor

This PR is marked as stale, because it has been open for 7 days with no activity.

@github-actions github-actions bot added the Status: Stale No activity for more than a week label May 26, 2025
@github-actions github-actions bot removed the Status: Stale No activity for more than a week label Jun 20, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Jun 23, 2025
@EttyKitty
Copy link
Collaborator Author

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jun 23, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (11)
scripts/scr_en_weapon/scr_en_weapon.gml (1)

154-166: Parameter naming inconsistency disrupts the litany of readability.

Throughout the freshly-forged hunk, the code oscillates between name (the declared parameter) and argument0. While functionally identical, this duality hinders clarity for future maintainers.

Recommendation: standardise on the explicit name parameter for legibility, or add a local alias at the top of the function and use it consistently.

scripts/scr_equipment_struct/scr_equipment_struct.gml (1)

169-180: Equality incantations mis-written; armor-penetration spirit is always set to Anti-Vehicle.

The comparison sigils employ a single = symbol, which in GML is assignment, not equivalence. Thus:

if (arp=4) { … }

mutates arp to 4, the expression evaluates to true, and every weapon immediately acquires the "Anti Vehicle" property—even las-cutlery.

Sanctify the logic with == (or, for elegance, a switch) so the Machine Spirit may discern the correct descriptor:

-                    if (arp=4){
+                    if (arp == 4) {
                         array_push(special_properties_array, "Anti Vehicle")
-                    } 
-                    else if (arp=1){
+                    } 
+                    else if (arp == 1) {
                         array_push(special_properties_array, "Low Penetration")
-                    }
-					else if (arp=2){
+                    }
+                    else if (arp == 2) {
                         array_push(special_properties_array, "Medium Penetration")
-                    }
-					else if (arp=3){
+                    }
+                    else if (arp == 3) {
                         array_push(special_properties_array, "High Penetration")
                     }

Without this correction, in-game balance will be catastrophically skewed.

objects/obj_p_assra/Step_0.gml (2)

70-70: Vestigial variable contamination persists.

The unused boarding_difficulty variable remains in the declaration list despite previous review feedback.


96-102: Weapon array cogitation error persists.

The weapon check still compares structs to empty strings and uses break instead of continue in the loop, as identified in previous reviews.

scripts/scr_shoot/scr_shoot.gml (3)

295-295: Out-of-band AP values detected - weapon effectiveness compromised.

The missile emplacement (-1) and silo (0) AP values fall outside the 1-4 range, resulting in zero armor reduction.

Map these to valid values:

-            armour_pierce = -1;
+            armour_pierce = 3; // Moderate AP for missile emplacement
-            armour_pierce = 0;
+            armour_pierce = 2; // Lower AP for area effect silo

Also applies to: 300-300


306-333: Inverted armor reduction cogitators - blessed penetration becomes cursed reinforcement.

The AP multipliers strengthen armor instead of weakening it. Higher AP values multiply armor by larger factors.

Reverse the multiplier logic:

         if (target_object.dudes_vehicle[target_type]) {
             if (armour_pierce == 4) {
                 target_armour_value = 0;
             }
             if (armour_pierce == 3) {
-                target_armour_value = target_armour_value * 2;
+                target_armour_value = target_armour_value * 0.25;
             }
             if (armour_pierce == 2) {
-                target_armour_value = target_armour_value * 4;
+                target_armour_value = target_armour_value * 0.5;
             }
             if (armour_pierce == 1) {
-                target_armour_value = target_armour_value * 6;
+                target_armour_value = target_armour_value * 0.75;
             }
         } else {
             if (armour_pierce == 4) {
                 target_armour_value = 0;
             }
             if (armour_pierce == 3) {
-                target_armour_value = target_armour_value * 1.5;
+                target_armour_value = target_armour_value * 0.3;
             }
             if (armour_pierce == 2) {
-                target_armour_value = target_armour_value * 2;
+                target_armour_value = target_armour_value * 0.5;
             }
             if (armour_pierce == 1) {
-                target_armour_value = target_armour_value * 3;
+                target_armour_value = target_armour_value * 0.7;
             }
         }

432-453: Duplicate machine-code detected - violates the sacred DRY principle.

Extract this repeated armor calculation into a blessed helper function.

Create a helper function:

function calculate_armor_reduction(base_armor, ap_value, is_vehicle) {
    if (ap_value == 4) return 0;
    
    var multipliers_vehicle = [0, 0.75, 0.5, 0.25]; // index by AP
    var multipliers_infantry = [0, 0.7, 0.5, 0.3];  // index by AP
    
    if (ap_value >= 1 && ap_value <= 3) {
        return base_armor * (is_vehicle ? multipliers_vehicle[ap_value] : multipliers_infantry[ap_value]);
    }
    
    return base_armor; // No reduction for invalid AP
}
scripts/scr_culture_visuals/scr_culture_visuals.gml (1)

1930-1940: Wrist-mount lacks servo-arm calibration data.

Add positioning metadata for proper gauntlet integration.

   base: {
     weapon_data: {
       display_type: "normal_ranged",
-      new_weapon_draw: true
+      new_weapon_draw: true,
+      arm_type: 1,
+      hand_type: 0
     },
   },
scripts/scr_weapon/scr_weapon.gml (3)

1087-1095: Missile Launcher description requires adjustment to reflect reduced penetration

The cogitators detect inconsistency between the weapon's description mentioning "armor-piercing" capability and its reduced armor penetration value of 2. This truth must be revealed to users.


704-704: Integrated weapon systems lack sacred documentation

The Machine Spirits of Integrated-Grav, Integrated-Melta, Integrated-Plasma, and Integrated-Flamer require proper liturgical descriptions for the Tech-Adepts to understand their blessed functions.

Also applies to: 879-879, 976-976, 1584-1584


2058-2060: Artificer Armour tier variance requires cogitation

The sacred armor values remain uniform across quality tiers (30/30/30), defying the hierarchical doctrine of the Mechanicus. Master-crafted and artifact variants should manifest superior protection.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e28c486 and 1113769.

⛔ Files ignored due to path filters (2)
  • sprites/spr_cyclone_launcher/8cb6d9eb-f4d0-4e70-8a60-33dd017f0b50.png is excluded by !**/*.png
  • sprites/spr_cyclone_launcher/layers/8cb6d9eb-f4d0-4e70-8a60-33dd017f0b50/0f31cf23-d758-4aec-a384-f40c841e8042.png is excluded by !**/*.png
📒 Files selected for processing (13)
  • ChapterMaster.yyp (3 hunks)
  • objects/obj_enunit/Alarm_1.gml (26 hunks)
  • objects/obj_p_assra/Step_0.gml (4 hunks)
  • objects/obj_popup/Draw_0.gml (3 hunks)
  • scripts/scr_clean/scr_clean.gml (4 hunks)
  • scripts/scr_culture_visuals/scr_culture_visuals.gml (2 hunks)
  • scripts/scr_en_weapon/scr_en_weapon.gml (13 hunks)
  • scripts/scr_equipment_struct/scr_equipment_struct.gml (3 hunks)
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml (3 hunks)
  • scripts/scr_shoot/scr_shoot.gml (5 hunks)
  • scripts/scr_unit_equip_functions/scr_unit_equip_functions.gml (4 hunks)
  • scripts/scr_weapon/scr_weapon.gml (61 hunks)
  • sprites/spr_cyclone_launcher/spr_cyclone_launcher.yy (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
`**/*.*`: - Having humanly understandable and maintainable code is always the top most priority. - DRY (Don't repeat yourself) principle is also very important. - Ensure that the c...

**/*.*: - Having humanly understandable and maintainable code is always the top most priority.

  • DRY (Don't repeat yourself) principle is also very important.
  • Ensure that the code is compliant with the CODE_STYLE.MD: https://github.com/Adeptus-Dominus/ChapterMaster/blob/main/docs/CODE_STYLE.md
  • If a TODO comment is added, ask the user if you should create a GitHub issue for this TODO.
  • If a TODO comment is deleted, remind the user if there is an active GitHub issue related to that comment.
  • sprites/spr_cyclone_launcher/spr_cyclone_launcher.yy
  • scripts/scr_en_weapon/scr_en_weapon.gml
  • scripts/scr_equipment_struct/scr_equipment_struct.gml
  • scripts/scr_unit_equip_functions/scr_unit_equip_functions.gml
  • objects/obj_popup/Draw_0.gml
  • objects/obj_p_assra/Step_0.gml
  • scripts/scr_shoot/scr_shoot.gml
  • scripts/scr_clean/scr_clean.gml
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml
  • objects/obj_enunit/Alarm_1.gml
  • ChapterMaster.yyp
  • scripts/scr_culture_visuals/scr_culture_visuals.gml
  • scripts/scr_weapon/scr_weapon.gml
`**/*.yy`: - When any script or sprite .yy files are deleted, their paths should also be deleted from the .yyp file, otherwise the game will crash. - When any script or sprite .yy ...

**/*.yy: - When any script or sprite .yy files are deleted, their paths should also be deleted from the .yyp file, otherwise the game will crash.

  • When any script or sprite .yy files are created, their paths should be added to the .yyp file, otherwise they'll fail.
  • sprites/spr_cyclone_launcher/spr_cyclone_launcher.yy
`**/*.gml`: - Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. `#macro ARR_body_parts["arm"]` will crash the ...

**/*.gml: - Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. #macro ARR_body_parts["arm"] will crash the game, because there is no space between the array and the name of the macro.

  • scripts/scr_en_weapon/scr_en_weapon.gml
  • scripts/scr_equipment_struct/scr_equipment_struct.gml
  • scripts/scr_unit_equip_functions/scr_unit_equip_functions.gml
  • objects/obj_popup/Draw_0.gml
  • objects/obj_p_assra/Step_0.gml
  • scripts/scr_shoot/scr_shoot.gml
  • scripts/scr_clean/scr_clean.gml
  • scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml
  • objects/obj_enunit/Alarm_1.gml
  • scripts/scr_culture_visuals/scr_culture_visuals.gml
  • scripts/scr_weapon/scr_weapon.gml
🔇 Additional comments (44)
ChapterMaster.yyp (3)

1073-1073: Cyclone launcher sprite integration verified.
The entry for spr_cyclone_launcher adheres to naming conventions and correct folder path.


1656-1656: Omnissian Axe sprite entry is correct.
spr_weapon_omnissian_axe follows the project's prefix and resource path standards.


1675-1675: Shotgun sprite added appropriately.
The spr_weapon_shotgun resource aligns with naming and directory conventions.

objects/obj_popup/Draw_0.gml (3)

1272-1273: LGTM: Data retrieval follows the blessed patterns.

The gear and mobility data retrieval aligns with the existing weapon data patterns. The Machine Spirit approves this consistency.


1448-1448: Simplified validation logic sanctified.

The removal of "Assortment" from the exclusion list whilst retaining ITEM_NAME_ANY and ITEM_NAME_NONE maintains proper validation hierarchy.


1470-1484: Tag-based validation replaces archaic string matching.

This blessed refactoring replaces hardcoded compatibility checks with flexible tag-based validation. The logic properly enforces terminator and dreadnought compatibility rules through the sacred has_tag() methods.

scripts/scr_en_weapon/scr_en_weapon.gml (2)

20-20: Default armor penetration blessed with the sacred unity.

The elevation of base armor penetration from 0 to 1 establishes a proper foundation for the new penetration hierarchy. The Machine Spirit approves this standardisation.

Also applies to: 29-29


36-1038: Comprehensive weapon rebalancing sanctified by the Omnissiah.

The systematic elevation of armor penetration values across all enemy weapon systems aligns with the sacred rebalancing protocols. The standardisation of attack values and refinement of range/splash parameters demonstrates proper adherence to the new combat doctrines.

sprites/spr_cyclone_launcher/spr_cyclone_launcher.yy (1)

1-90: Sacred sprite resource properly inscribed in the data-vaults.

The Cyclone Launcher sprite follows the blessed GameMaker resource structure. Proper categorisation under MarineViewer texture group ensures efficient rendering. The Machine Spirit approves this addition to the arsenal.

scripts/scr_equipment_struct/scr_equipment_struct.gml (2)

49-49: Maintenance calculation sanctified with additive logic.

The change from assignment to addition allows proper accumulation of maintenance values rather than overwriting existing calculations. The Machine Spirit approves this refinement.


326-326: Documentation blessed with clarity.

The addition of parameter documentation for gear_weapon_data enhances the sacred knowledge-base for future Tech-Adepts.

objects/obj_enunit/Alarm_1.gml (5)

76-1733: Blessed be the Omnissiah's rebalancing protocols.

The extensive defensive stat adjustments align with the broader combat rebalancing initiative. The values appear systematically adjusted to create better unit differentiation and combat progression.


798-800: Machine-spirit classification corrected.

The reclassification of "Shining Spear" units from infantry to vehicles aligns with their jetbike nature. This will properly apply vehicle combat mechanics to these units.


1774-1774: Proper instance termination protocols engaged.

Passing the instance ID to instance_destroy() ensures correct target elimination.


1781-1781: Engagement detection subroutines optimised.

The consolidated collision detection with increased offset (14 units) simplifies the logic while maintaining functionality.


786-786: Cogitate: Verify weapon nomenclature consistency.

The weapon name change from "Eldar Missile Launcher" to "Tempest Launcher" must be reflected across all data files and weapon definitions to prevent null reference exceptions.

#!/bin/bash
# Description: Verify the weapon name change is consistent across the codebase

# Search for any remaining references to the old weapon name
rg "Eldar Missile Launcher" -A 2 -B 2

# Verify the new weapon exists in weapon definitions
ast-grep --pattern 'Tempest Launcher'
scripts/scr_unit_equip_functions/scr_unit_equip_functions.gml (2)

331-368: Tag-based validation protocols are most efficient.

The comprehensive validation logic properly enforces equipment restrictions using the tag system. The specific handling for terminator armour, power armour requirements, and the edge case for Jump Packs without armour demonstrates thorough implementation.


334-382: Error cogitation protocols vastly improved.

The transition from string error codes to boolean returns with detailed logging follows standard machine-spirit communication protocols. The contextual error messages will aid future Tech-Adepts in diagnostics.

scripts/scr_clean/scr_clean.gml (1)

135-150: By the Omnissiah’s cog, scanning for weapons with AP values 2 or 3…

#!/bin/bash
# Description: Check for weapons with AP values 2 or 3
rg "arp *= *[23]" -n scripts/scr_weapon/
objects/obj_p_assra/Step_0.gml (2)

85-132: Modular boarding protocols are most efficient.

The separation of boarding odds into distinct components (base odds, advantages, disadvantages, gear bonuses, marine bonuses) with final clamping creates a more maintainable and balanced system.


104-114: Tag-based weapon protocols properly implemented.

The transition from hardcoded weapon checks to tag-based bonuses ("boarding 1", "boarding 2", "boarding 3") aligns with the Omnissiah's grand design for modular weapon systems.

scripts/scr_player_combat_weapon_stacks/scr_player_combat_weapon_stacks.gml (4)

38-54: Ammunition allocation protocols enhanced.

The conditional ammo multipliers based on unit type and equipment tags (dreadnought 3x, bonus_ammo 2x, vehicle 4x) provide meaningful equipment differentiation.


332-341: Combat flow subroutines properly centralised.

The set_up_player_blocks_turn function consolidates alarm setting and turn increment logic, improving code organisation.


343-359: Message array reset protocols consolidated.

The reset_combat_message_arrays function properly centralises message handling logic previously scattered across combat objects.


292-292: Vehicle weapon stack protocols correctly implemented.

Passing "vehicle" as the unit parameter properly triggers the 4x ammunition multiplier for vehicle-mounted weapons.

scripts/scr_shoot/scr_shoot.gml (2)

100-100: Blessed consistency in parameter propagation.

The weapon_index_position parameter addition to all scr_clean invocations is properly implemented.

Also applies to: 136-136, 187-187


144-146: Proper timing adjustment for attack modifier application.

Moving the shots_fired multiplication before the melee check ensures consistent application across all combat types.

scripts/scr_culture_visuals/scr_culture_visuals.gml (3)

612-619: Cyclone Missile System integration - properly blessed.

The sacred missile augmentation is correctly configured for Terminator deployment.


1942-1952: Scout shotgun manifest - correctly catalogued.

The close-quarters blessed boomstick is properly configured.


1954-1968: Omnissian Axe sanctified - proper servo-arm grip parameters.

The blessed implement of tech-redemption is correctly configured with appropriate melee handling.

scripts/scr_weapon/scr_weapon.gml (14)

17-17: Blessed modification to Storm Shield boarding protocols

The addition of "boarding 2" tag aligns with the sacred doctrines of void combat. The Machine Spirit approves.


33-33: Optimal boarding designation for Boarding Shield

The "boarding 3" tag correctly represents this shield's superior protection during boarding actions, as befitting its designation.


51-56: Archeotech Laspistol sanctified with proper combat parameters

The holy trinity of range (4.1), splash (0), and armor penetration (1) has been properly calibrated. The Omnissiah smiles upon these adjustments.


61-72: Combat Knife lethality parameters optimized

Attack values (100/125/150) and splash damage (2) properly reflect this blade's effectiveness in Astartes hands. The armor penetration value of 1 is appropriate for a basic melee weapon.


77-88: Chainsword receives righteous fury enhancement

The increased attack values (150/180/250) and addition of "savage" and "boarding 1" tags properly represent this weapon's brutal nature. Splash damage of 4 reflects its chain-teeth's area effect.


289-312: The Omnissiah's blessed implement manifests!

This sacred weapon of the Mechanicus is properly configured with formidable attack values (400/450/550) and the divine "combi_tool" special property. The armor penetration of 3 and "boarding 3" tag befit a weapon of such holy purpose.


648-663: Scout Shotgun parameters correctly calibrated

The weapon's close-range nature (4.1) and high splash damage (8) properly simulate scatter-shot effectiveness. Attack values (250/300/350) are appropriately balanced for scout operations.


1097-1112: Cyclone Missile Launcher ordained for righteous devastation

This terminator-mounted weapon system shows proper calibration with doubled splash damage (20) compared to standard patterns, befitting its rapid-fire capability. The Omnissiah approves these specifications.


1194-1207: Heavy Bolter penetration protocols adjusted per sacred edict

The reduction to armor penetration 2 properly reflects this weapon's role as an anti-infantry platform rather than anti-armor. The Machine Spirit acknowledges this rebalancing.


1032-1047: Deathwatch xenophase targeting protocols implemented

This sanctified long-rifle shows proper superiority over standard patterns with enhanced damage output (250/300/350) and improved armor penetration (2). The Watch approves.


88-88: Boarding action protocols properly sanctified

The sacred gradations of boarding effectiveness (1-3) have been applied with appropriate logic across the arsenal. Basic implements receive minimal blessing, while siege-rated weapons achieve maximum void-combat efficiency.

Also applies to: 109-109, 173-173, 231-231, 287-287, 352-352, 402-402, 418-418


2793-2796: Servo-appendage machine spirits properly attuned

The transition from "special_properties" to "specials" field represents proper data sanctification. The "combi_tool" values (1 for arm, 2 for harness) correctly reflect their blessed repair capabilities.

Also applies to: 2809-2812


1145-1145: Integrated-Bolter designation achieves uniformity

The hyphenated nomenclature now aligns with other integrated weapon patterns, bringing harmony to the data-spirits.


2822-2829: Cyclone Missile System integration protocols verified

This blessed Terminator-exclusive system properly links to its weapon profile and applies appropriate hand usage penalties. The "terminator_only" tag ensures proper deployment restrictions.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jun 24, 2025
@EttyKitty EttyKitty marked this pull request as ready for review June 24, 2025 03:37
Copy link
Collaborator

@Blogaugis Blogaugis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't see any obvious issues.

@EttyKitty EttyKitty marked this pull request as draft June 28, 2025 06:12
@github-actions
Copy link
Contributor

github-actions bot commented Jul 5, 2025

This PR is marked as stale, because it has been open for 7 days with no activity.

@github-actions github-actions bot added the Status: Stale No activity for more than a week label Jul 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: Sprites Changes to sprites/images or their under-the-hood functionality Category: Balance Affects game balance Category: Improvement Makes something better Size: Warning Status: Stale No activity for more than a week Type: Feature Adds something new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants