From cbcfc611739f2caf90486b1dc8b41693684ef8e9 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 Jul 2015 18:30:30 -0500 Subject: [PATCH 01/32] Adds specific cell for mechs instead of 15k-charge hi-cap. --- code/game/objects/items/weapons/power_cells.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index bd5e56495a9..c58054e080f 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -73,6 +73,13 @@ maxcharge = 10000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) +/obj/item/weapon/cell/mecha + name = "exosuit-grade power cell" + origin_tech = list(TECH_POWER = 3) + icon_state = "hcell" + maxcharge = 15000 + matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) + /obj/item/weapon/cell/high/empty/New() ..() charge = 0 @@ -107,7 +114,7 @@ origin_tech = null maxcharge = 30000 //determines how badly mobs get shocked matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80) - + check_charge() return 1 use() From 969cd79ceeb7c502a30753e4863f9480e07e6ed5 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 11 Jul 2015 17:52:05 -0500 Subject: [PATCH 02/32] Initial commit for refactor of some mech tools. --- code/game/mecha/combat/durand.dm | 6 +- code/game/mecha/combat/gygax.dm | 13 +- code/game/mecha/combat/marauder.dm | 4 +- code/game/mecha/equipment/tools/tools.dm | 145 +++++++++++++++------- code/game/mecha/mecha.dm | 146 ++++++++++------------- code/modules/research/designs.dm | 10 +- 6 files changed, 176 insertions(+), 148 deletions(-) diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 9ee9f3c3cac..31bfa8b8bc1 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -12,7 +12,7 @@ infra_luminosity = 8 force = 40 var/defence = 0 - var/defence_deflect = 35 + var/def_boost = 15 wreckage = /obj/effect/decal/mecha_wreckage/durand /* @@ -43,10 +43,10 @@ return defence = !defence if(defence) - deflect_chance = defence_deflect + deflect_chance += def_boost src.occupant_message("You enable [src] defence mode.") else - deflect_chance = initial(deflect_chance) + deflect_chance -= def_boost src.occupant_message("You disable [src] defence mode.") src.log_message("Toggled defence mode.") return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index b47564e2b36..f6c44b0ba66 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -42,15 +42,8 @@ ME.attach(src) return -/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 30000 - cell.maxcharge = 30000 - +/obj/mecha/combat/gygax/dark/add_cell() + cell = new /obj/item/weapon/cell/hyper(src) /obj/mecha/combat/gygax/verb/overload() set category = "Exosuit Interface" @@ -72,7 +65,7 @@ src.log_message("Toggled leg actuators overload.") return -/obj/mecha/combat/gygax/dyndomove(direction) +/obj/mecha/combat/gygax/do_move(direction) if(!..()) return if(overload) health-- diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index bf23e579f3f..e4fcfebcb57 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -51,7 +51,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) src.smoke_system.set_up(3, 0, src) src.smoke_system.attach(src) @@ -72,7 +72,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) return diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 2b17096547c..56eb19f3a64 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -498,19 +498,91 @@ return -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. +/obj/item/mecha_parts/mecha_equipment/armor_booster + name = "armor booster" + desc = "Powered armor-enhancing mech equipment." + icon_state = "mecha_abooster_proj" + equip_cooldown = 10 + energy_drain = 50 + range = 0 + var/datum/global_iterator/pr_armor_booster + var/deflect_coeff = 1 + var/damage_coeff = 1 + var/active + + can_attach(obj/mecha/M as obj) + if(..()) + return 1 + return 0 + + attach(obj/mecha/M as obj) + ..() + activate_boost() + pr_armor_booster = new /datum/global_iterator/active_armor_booster(list(src),0) + pr_armor_booster.set_delay(equip_cooldown) + pr_armor_booster.start() + return + + detach() + if(active) + deactivate_boost() + pr_armor_booster.stop() + ..() + return + + get_equip_info() + if(!chassis) return + return "* [src.name]" + + proc/activate_boost() + active = 1 + return + + proc/deactivate_boost() + active = 0 + return + + /datum/global_iterator/active_armor_booster + + process(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B) + + if(!B.chassis) + B.set_ready_state(1) + stop() + + if(!B.action_checks(1) && B.active) + B.deactivate_boost() + return + else if(B.action_checks(1) && !B.active) + B.activate_boost() + return + + return + +/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "\improper CCW armor booster" desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" origin_tech = list(TECH_MATERIAL = 3) - equip_cooldown = 10 - energy_drain = 50 - range = 0 construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + deflect_coeff = 1.15 + damage_coeff = 0.8 - can_attach(obj/mecha/M as obj) + activate_boost() + chassis.m_deflect_coeff *= deflect_coeff + chassis.m_damage_coeff *= damage_coeff + chassis.mhit_power_use += energy_drain + ..() + return + + deactivate_boost() + chassis.m_deflect_coeff /= deflect_coeff + chassis.m_damage_coeff /= damage_coeff + chassis.mhit_power_use -= energy_drain + ..() + return + +/* can_attach(obj/mecha/M as obj) if(..()) if(!M.proc_res["dynattackby"]) return 1 @@ -530,7 +602,7 @@ if(!chassis) return return "* [src.name]" - proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) + /*proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) if(!action_checks(user)) return chassis.dynattackby(W,user) chassis.log_message("Attacked by [W]. Attacker - [user]") @@ -545,44 +617,33 @@ set_ready_state(0) chassis.use_power(energy_drain) do_after_cooldown() - return + return*/*/ -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster +/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster name = "\improper RW armor booster" desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate." icon_state = "mecha_abooster_proj" origin_tech = list(TECH_MATERIAL = 4) - equip_cooldown = 10 - energy_drain = 50 - range = 0 construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + deflect_coeff = 1.15 + damage_coeff = 0.8 - can_attach(obj/mecha/M as obj) - if(..()) - if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"]) - return 1 - return 0 - - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynbulletdamage"] = src - chassis.proc_res["dynhitby"] = src - return - - detach() - chassis.proc_res["dynbulletdamage"] = null - chassis.proc_res["dynhitby"] = null + activate_boost() + chassis.r_deflect_coeff *= deflect_coeff + chassis.r_damage_coeff *= damage_coeff + chassis.rhit_power_use += energy_drain ..() return - get_equip_info() - if(!chassis) return - return "* [src.name]" + deactivate_boost() + chassis.r_deflect_coeff /= deflect_coeff + chassis.r_damage_coeff /= damage_coeff + chassis.rhit_power_use -= energy_drain + ..() + return - proc/dynbulletdamage(var/obj/item/projectile/Proj) +/* proc/dynbulletdamage(var/obj/item/projectile/Proj) if(!action_checks(src)) return chassis.dynbulletdamage(Proj) if(prob(chassis.deflect_chance*deflect_coeff)) @@ -616,7 +677,7 @@ set_ready_state(0) chassis.use_power(energy_drain) do_after_cooldown() - return + return */ /obj/item/mecha_parts/mecha_equipment/repair_droid @@ -740,24 +801,22 @@ detach() pr_energy_relay.stop() -// chassis.proc_res["dynusepower"] = null - chassis.proc_res["dyngetcharge"] = null +// chassis.proc_res["dyngetcharge"] = null ..() return attach(obj/mecha/M) ..() - chassis.proc_res["dyngetcharge"] = src -// chassis.proc_res["dynusepower"] = src +// chassis.proc_res["dyngetcharge"] = src return can_attach(obj/mecha/M) if(..()) - if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"]) - return 1 + // if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"]) + return 1 return 0 - proc/dyngetcharge() + /*proc/dyngetcharge() if(equip_ready) //disabled return chassis.dyngetcharge() var/area/A = get_area(chassis) @@ -767,7 +826,7 @@ charge = 1000 //making magic else return chassis.dyngetcharge() - return charge + return charge*/ proc/get_power_channel(var/area/A) var/pow_chan diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 96dda70158f..77a610d6569 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -25,7 +25,15 @@ var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/step_energy_drain = 10 var/health = 300 //health is health - var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act. + var/r_deflect_coeff = 1 + var/m_deflect_coeff = 1 + //ranged and melee damage multipliers + var/r_damage_coeff = 1 + var/m_damage_coeff = 1 + var/rhit_power_use = null + var/mhit_power_use = null + //the values in this list show how much damage will pass through, not how much will be absorbed. var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) var/obj/item/weapon/cell/cell @@ -35,7 +43,6 @@ var/add_req_access = 1 var/maint_access = 1 var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference var/datum/effect/effect/system/spark_spread/spark_system = new var/lights = 0 var/lights_power = 6 @@ -86,9 +93,7 @@ icon_state += "-open" add_radio() add_cabin() - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) + add_airtank() //All mecha currently have airtanks. No need to check unless changes are made. spark_system.set_up(2, 0, src) spark_system.attach(src) add_cell() @@ -166,15 +171,8 @@ internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank -/obj/mecha/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.name = "high-capacity power cell" - cell.charge = 15000 - cell.maxcharge = 15000 +/obj/mecha/proc/add_cell() + cell = new /obj/item/weapon/cell/mecha(src) /obj/mecha/proc/add_cabin() cabin_air = new @@ -192,7 +190,7 @@ /obj/mecha/proc/add_iterators() pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src)) - pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0) + pr_inertial_movement = new /datum/global_iterator/mecha_inertial_movement(null,0) pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src)) pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0) @@ -281,12 +279,12 @@ if(!src.occupant || src.occupant != user ) return if(user.stat) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return if(!get_charge()) return if(src == target) return var/dir_to_target = get_dir(src,target) - if(dir_to_target && !(dir_to_target & src.dir))//wrong direction + if(dir_to_target && !(dir_to_target & src.dir)) return if(hasInternalDamage(MECHA_INT_CONTROL_LOST)) target = safepick(view(3,target)) @@ -352,18 +350,15 @@ return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port.") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return - return domove(direction) + return do_move(direction) -/obj/mecha/proc/domove(direction) - return call((proc_res["dyndomove"]||src), "dyndomove")(direction) - -/obj/mecha/proc/dyndomove(direction) +/obj/mecha/proc/do_move(direction) if(!can_move) return 0 if(src.pr_inertial_movement.active()) @@ -479,21 +474,18 @@ /obj/mecha/proc/take_damage(amount, type="brute") if(amount) - var/damage = absorbDamage(amount,type) + var/damage = absorb_damage(amount,type) health -= damage update_health() log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1) return -/obj/mecha/proc/absorbDamage(damage,damage_type) - return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type) - -/obj/mecha/proc/dynabsorbdamage(damage,damage_type) +/obj/mecha/proc/absorb_damage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) /obj/mecha/airlock_crush(var/crush_damage) ..() - take_damage(crush_damage) + take_damage(crush_damage*m_damage_coeff) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 @@ -510,8 +502,8 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) - if(!prob(src.deflect_chance)) - src.take_damage(15) + if(!prob(src.deflect_chance*m_deflect_coeff)) + src.take_damage(15*m_damage_coeff) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) user << "You slash at the armored suit!" @@ -526,8 +518,8 @@ user.visible_message("\The [user] hits \the [src]. Nothing happensm","You hit \the [src] with no visible effect.") src.log_append_to_last("Armor saved.") return - else if ((HULK in user.mutations) && !prob(src.deflect_chance)) - src.take_damage(15) + else if ((HULK in user.mutations) && !prob(src.deflect_chance*m_deflect_coeff)) + src.take_damage(15*m_damage_coeff) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") else @@ -535,53 +527,43 @@ src.log_append_to_last("Armor saved.") return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper +/obj/mecha/hitby(atom/movable/A as mob|obj) ..() src.log_message("Hit by [A].",1) - call((proc_res["dynhitby"]||src), "dynhitby")(A) - return - -/obj/mecha/proc/dynhitby(atom/movable/A) if(istype(A, /obj/item/mecha_parts/mecha_tracking)) A.forceMove(src) src.visible_message("The [A] fastens firmly to [src].") return - if(prob(src.deflect_chance) || istype(A, /mob)) + if(prob(src.deflect_chance*r_deflect_coeff) || istype(A, /mob)) src.occupant_message("\The [A] bounces off the armor.") - src.visible_message("\The [A] bounces off \the [src] armor") + src.visible_message("\The [A] bounces off \the [src] armor.") src.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) var/mob/living/M = A M.take_organ_damage(10) else if(istype(A, /obj)) var/obj/O = A - if(O.throwforce) - src.take_damage(O.throwforce) + if(O.throwforce*r_damage_coeff) + src.take_damage(O.throwforce*r_damage_coeff) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return - -/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper +/obj/mecha/bullet_act(var/obj/item/projectile/Proj) src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) - call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment - ..() - return - -/obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(prob(src.deflect_chance)) + if(prob(src.deflect_chance*r_deflect_coeff)) src.occupant_message("The armor deflects incoming projectile.") - src.visible_message("The [src.name] armor deflects the projectile") + src.visible_message("The [src.name] armor deflects the projectile.") src.log_append_to_last("Armor saved.") return - if(Proj.damage_type == HALLOSS) + if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1)) use_power(Proj.agony * 5) if(!(Proj.nodamage)) var/ignore_threshold if(istype(Proj, /obj/item/projectile/beam/pulse)) ignore_threshold = 1 - src.take_damage(Proj.damage, Proj.check_armour) + src.take_damage(Proj.damage*r_damage_coeff, Proj.check_armour) if(prob(25)) spark_system.start() src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) @@ -602,6 +584,7 @@ break //give a chance to exit early Proj.on_hit(src) + ..() return /obj/mecha/ex_act(severity) @@ -663,22 +646,6 @@ src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL)) return -/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\The [W] bounces off [src.name]." - src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ - else - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) - src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - return ////////////////////// ////// AttackBy ////// @@ -745,10 +712,10 @@ src.cell = null state = 4 user << "You unscrew and pry out the powercell." - src.log_message("Powercell removed") + src.log_message("Powercell removed.") else if(state==4 && src.cell) state=3 - user << "You screw the cell in place" + user << "You screw the cell in place." return else if(istype(W, /obj/item/device/multitool)) @@ -797,7 +764,21 @@ return else - call((proc_res["dynattackby"]||src), "dynattackby")(W,user) + src.log_message("Attacked by [W]. Attacker - [user]") + if(prob(src.deflect_chance*m_deflect_coeff)) + user << "\The [W] bounces off [src.name]." + src.log_append_to_last("Armor saved.") +/* + for (var/mob/V in viewers(src)) + if(V.client && !(V.blinded)) + V.show_message("The [W] bounces off [src.name] armor.", 1) +*/ + else + src.occupant_message("[user] hits [src] with [W].") + user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") + src.take_damage(W.force*m_damage_coeff,W.damtype) + src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) + return /* src.log_message("Attacked by [W]. Attacker - [user]") if(prob(src.deflect_chance)) @@ -1245,7 +1226,7 @@ var/integrity = health/initial(health)*100 var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" - var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" //Results in type mismatch if there is no tank. var/cabin_pressure = round(return_pressure(),0.01) var/output = {"[report_internal_damage()] [integrity<30?"DAMAGE LEVEL CRITICAL
":null] @@ -1653,16 +1634,11 @@ return (get_charge()>=amount) /obj/mecha/proc/get_charge() - return call((proc_res["dyngetcharge"]||src), "dyngetcharge")() - -/obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge - if(!src.cell) return + if(!src.cell) + return return max(0, src.cell.charge) /obj/mecha/proc/use_power(amount) - return call((proc_res["dynusepower"]||src), "dynusepower")(amount) - -/obj/mecha/proc/dynusepower(amount) if(get_charge()) cell.use(amount) return 1 @@ -1689,8 +1665,8 @@ src.log_message("Attacked. Attacker - [user].",1) user.do_attack_animation(src) - if(!prob(src.deflect_chance)) - src.take_damage(damage) + if(!prob(src.deflect_chance*m_deflect_coeff)) + src.take_damage(damage*m_damage_coeff) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [attack_message] [src]!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") @@ -1708,7 +1684,7 @@ ////////////////////////////////////////// -/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium +/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsius delay = 20 process(var/obj/mecha/mecha) @@ -1750,7 +1726,7 @@ return stop() return -/datum/global_iterator/mecha_intertial_movement //inertial movement in space +/datum/global_iterator/mecha_inertial_movement //inertial movement in space delay = 7 process(var/obj/mecha/mecha as obj,direction) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 65219eade83..9f7a14744a1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -367,7 +367,7 @@ other types of metals and chemistry for reagents). /datum/design/item/beaker/AssembleDesignName() name = "Beaker prototype ([item_name])" - + /datum/design/item/beaker/noreact name = "cryostasis" desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." @@ -375,7 +375,7 @@ other types of metals and chemistry for reagents). req_tech = list(TECH_MATERIAL = 2) materials = list("metal" = 3000) build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact - sort_string = "MADAA" + sort_string = "MADAA" /datum/design/item/beaker/bluespace name = TECH_BLUESPACE @@ -1537,13 +1537,13 @@ MECHAS BELOW desc = "Exosuit close-combat armor booster." id = "mech_ccw_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster /datum/design/item/mecha/proj_armor desc = "Exosuit projectile armor booster." id = "mech_proj_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING=3) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster /datum/design/item/mecha/syringe_gun desc = "Exosuit-mounted syringe gun and chemical synthesizer." @@ -1647,4 +1647,4 @@ datum/design/rust_injector build_type = IMPRINTER materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "uranium" = 2000) build_path = "/obj/item/weapon/circuitboard/rust_core" -*/ +*/ From ad405c54e966662c98ac1a6ee77eb22e8fa2cf80 Mon Sep 17 00:00:00 2001 From: LightningIron Date: Mon, 13 Jul 2015 14:50:25 -0500 Subject: [PATCH 03/32] Finalized mech equipment proc refactor. --- code/game/mecha/combat/marauder.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 2 +- code/game/mecha/equipment/tools/tools.dm | 146 ++----------------- code/game/mecha/mecha.dm | 124 ++++++++++------ 4 files changed, 95 insertions(+), 179 deletions(-) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index e4fcfebcb57..13a26ebaa9b 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -62,7 +62,7 @@ var/obj/item/mecha_parts/mecha_equipment/ME if(equipment.len)//Now to remove it and equip anew. for(ME in equipment) - equipment -= ME + ME.detach(src) qdel(ME) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) ME.attach(src) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 607e8f445c9..d378d1f87e5 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -19,7 +19,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1) - sleep(equip_cooldown) + spawn(equip_cooldown) set_ready_state(1) if(target && chassis) return 1 diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 56eb19f3a64..fecd5ea87e3 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -505,10 +505,9 @@ equip_cooldown = 10 energy_drain = 50 range = 0 - var/datum/global_iterator/pr_armor_booster var/deflect_coeff = 1 var/damage_coeff = 1 - var/active + var/melee can_attach(obj/mecha/M as obj) if(..()) @@ -518,15 +517,11 @@ attach(obj/mecha/M as obj) ..() activate_boost() - pr_armor_booster = new /datum/global_iterator/active_armor_booster(list(src),0) - pr_armor_booster.set_delay(equip_cooldown) - pr_armor_booster.start() return detach() - if(active) + if(equip_ready) deactivate_boost() - pr_armor_booster.stop() ..() return @@ -535,29 +530,18 @@ return "* [src.name]" proc/activate_boost() - active = 1 return proc/deactivate_boost() - active = 0 return - /datum/global_iterator/active_armor_booster + set_ready_state(state) + if(state && !equip_ready) + activate_boost() + else if(src.chassis && equip_ready) //check that the booster is still attached to something. + deactivate_boost() + ..() - process(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B) - - if(!B.chassis) - B.set_ready_state(1) - stop() - - if(!B.action_checks(1) && B.active) - B.deactivate_boost() - return - else if(B.action_checks(1) && !B.active) - B.activate_boost() - return - - return /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "\improper CCW armor booster" @@ -567,57 +551,20 @@ construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) deflect_coeff = 1.15 damage_coeff = 0.8 + melee = 1 activate_boost() chassis.m_deflect_coeff *= deflect_coeff chassis.m_damage_coeff *= damage_coeff chassis.mhit_power_use += energy_drain ..() - return + deactivate_boost() chassis.m_deflect_coeff /= deflect_coeff chassis.m_damage_coeff /= damage_coeff chassis.mhit_power_use -= energy_drain ..() - return - -/* can_attach(obj/mecha/M as obj) - if(..()) - if(!M.proc_res["dynattackby"]) - return 1 - return 0 - - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynattackby"] = src - return - - detach() - chassis.proc_res["dynattackby"] = null - ..() - return - - get_equip_info() - if(!chassis) return - return "* [src.name]" - - /*proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - if(!action_checks(user)) - return chassis.dynattackby(W,user) - chassis.log_message("Attacked by [W]. Attacker - [user]") - if(prob(chassis.deflect_chance*deflect_coeff)) - user << "\The [W] bounces off [chassis] armor." - chassis.log_append_to_last("Armor saved.") - else - chassis.occupant_message("\The [user] hits [chassis] with [W].") - user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].") - chassis.take_damage(round(W.force*damage_coeff),W.damtype) - chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return*/*/ /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster @@ -628,56 +575,20 @@ construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) deflect_coeff = 1.15 damage_coeff = 0.8 + melee = 0 activate_boost() chassis.r_deflect_coeff *= deflect_coeff chassis.r_damage_coeff *= damage_coeff chassis.rhit_power_use += energy_drain ..() - return + deactivate_boost() chassis.r_deflect_coeff /= deflect_coeff chassis.r_damage_coeff /= damage_coeff chassis.rhit_power_use -= energy_drain ..() - return - -/* proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(!action_checks(src)) - return chassis.dynbulletdamage(Proj) - if(prob(chassis.deflect_chance*deflect_coeff)) - chassis.occupant_message("The armor deflects incoming projectile.") - chassis.visible_message("The [chassis.name] armor deflects the projectile") - chassis.log_append_to_last("Armor saved.") - else - chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour) - chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - Proj.on_hit(chassis) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return - - proc/dynhitby(atom/movable/A) - if(!action_checks(A)) - return chassis.dynhitby(A) - if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking)) - chassis.occupant_message("The [A] bounces off the armor.") - chassis.visible_message("The [A] bounces off the [chassis] armor") - chassis.log_append_to_last("Armor saved.") - if(istype(A, /mob/living)) - var/mob/living/M = A - M.take_organ_damage(10) - else if(istype(A, /obj)) - var/obj/O = A - if(O.throwforce) - chassis.take_damage(round(O.throwforce*damage_coeff)) - chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return */ /obj/item/mecha_parts/mecha_equipment/repair_droid @@ -801,33 +712,13 @@ detach() pr_energy_relay.stop() -// chassis.proc_res["dyngetcharge"] = null ..() return attach(obj/mecha/M) ..() -// chassis.proc_res["dyngetcharge"] = src return - can_attach(obj/mecha/M) - if(..()) - // if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"]) - return 1 - return 0 - - /*proc/dyngetcharge() - if(equip_ready) //disabled - return chassis.dyngetcharge() - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - var/charge = 0 - if(pow_chan) - charge = 1000 //making magic - else - return chassis.dyngetcharge() - return charge*/ - proc/get_power_channel(var/area/A) var/pow_chan if(A) @@ -852,15 +743,6 @@ if(!chassis) return return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate" -/* proc/dynusepower(amount) - if(!equip_ready) //enabled - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - if(pow_chan) - A.master.use_power(amount*coeff, pow_chan) - return 1 - return chassis.dynusepower(amount)*/ - /datum/global_iterator/mecha_energy_relay process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER) @@ -883,7 +765,7 @@ pow_chan = c break if(pow_chan) - var/delta = min(12, ER.chassis.cell.maxcharge-cur_charge) + var/delta = ER.chassis.cell.maxcharge-cur_charge ER.chassis.give_power(delta) A.use_power(delta*ER.coeff, pow_chan) return @@ -1272,4 +1154,4 @@ if (OCCUPIED|LOCKED) usr << "All of the passenger compartments are already occupied or locked!" if (0) - usr << "\The [src] doesn't have a passenger compartment." + usr << "\The [src] doesn't have a passenger compartment." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 77a610d6569..73914c649d8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -24,6 +24,7 @@ var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/step_energy_drain = 10 + var/power_source = "cell" var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act. var/r_deflect_coeff = 1 @@ -31,8 +32,8 @@ //ranged and melee damage multipliers var/r_damage_coeff = 1 var/m_damage_coeff = 1 - var/rhit_power_use = null - var/mhit_power_use = null + var/rhit_power_use = 0 + var/mhit_power_use = 0 //the values in this list show how much damage will pass through, not how much will be absorbed. var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) @@ -483,9 +484,65 @@ /obj/mecha/proc/absorb_damage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) +/obj/mecha/proc/hit_damage(damage, type="brute", is_melee=0) + + var/power_to_use + var/damage_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + damage_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + damage_coeff_to_use = r_damage_coeff + + if(power_to_use && use_power(power_to_use)) + take_damage(round(damage*damage_coeff_to_use), type) + start_booster_cooldown(is_melee) + return + else + start_booster_cooldown(is_melee) + take_damage(round(damage*damage_coeff_to_use), type) + + return + +/obj/mecha/proc/deflect_hit(is_melee=0) + + var/power_to_use + var/deflect_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + deflect_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + deflect_coeff_to_use = r_damage_coeff + + if(power_to_use) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + use_power(power_to_use) + start_booster_cooldown(is_melee) + return 1 + else + return 0 + + else + start_booster_cooldown(is_melee) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + return 1 + + return 0 + +/obj/mecha/proc/start_booster_cooldown(is_melee) + + for(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B in equipment) //Ideally this would be done by the armor booster itself; attempts weren't great for performance. + if(B.melee == is_melee && B.equip_ready) + B.set_ready_state(0) + B.do_after_cooldown() + /obj/mecha/airlock_crush(var/crush_damage) ..() - take_damage(crush_damage*m_damage_coeff) + hit_damage(crush_damage, is_melee=1) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 @@ -502,8 +559,8 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) - if(!prob(src.deflect_chance*m_deflect_coeff)) - src.take_damage(15*m_damage_coeff) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) user << "You slash at the armored suit!" @@ -518,8 +575,8 @@ user.visible_message("\The [user] hits \the [src]. Nothing happensm","You hit \the [src] with no visible effect.") src.log_append_to_last("Armor saved.") return - else if ((HULK in user.mutations) && !prob(src.deflect_chance*m_deflect_coeff)) - src.take_damage(15*m_damage_coeff) + else if ((HULK in user.mutations) && !deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") else @@ -534,7 +591,7 @@ A.forceMove(src) src.visible_message("The [A] fastens firmly to [src].") return - if(prob(src.deflect_chance*r_deflect_coeff) || istype(A, /mob)) + if(deflect_hit(is_melee=0) || istype(A, /mob)) src.occupant_message("\The [A] bounces off the armor.") src.visible_message("\The [A] bounces off \the [src] armor.") src.log_append_to_last("Armor saved.") @@ -543,27 +600,27 @@ M.take_organ_damage(10) else if(istype(A, /obj)) var/obj/O = A - if(O.throwforce*r_damage_coeff) - src.take_damage(O.throwforce*r_damage_coeff) + if(O.throwforce) + src.hit_damage(O.throwforce, is_melee=0) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return /obj/mecha/bullet_act(var/obj/item/projectile/Proj) + if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1)) + use_power(Proj.agony * 5) + src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) - if(prob(src.deflect_chance*r_deflect_coeff)) + if(deflect_hit(is_melee=0)) src.occupant_message("The armor deflects incoming projectile.") src.visible_message("The [src.name] armor deflects the projectile.") src.log_append_to_last("Armor saved.") return - if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1)) - use_power(Proj.agony * 5) - if(!(Proj.nodamage)) var/ignore_threshold if(istype(Proj, /obj/item/projectile/beam/pulse)) ignore_threshold = 1 - src.take_damage(Proj.damage*r_damage_coeff, Proj.check_armour) + src.hit_damage(Proj.damage, Proj.check_armour, is_melee=0) if(prob(25)) spark_system.start() src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) @@ -632,8 +689,7 @@ */ /obj/mecha/emp_act(severity) - if(get_charge()) - use_power((cell.charge/2)/severity) + if(use_power((cell.charge/2)/severity)) take_damage(50 / severity,"energy") src.log_message("EMP detected",1) check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) @@ -765,39 +821,17 @@ else src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance*m_deflect_coeff)) + + if(deflect_hit(is_melee=1)) user << "\The [W] bounces off [src.name]." src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ else src.occupant_message("[user] hits [src] with [W].") user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force*m_damage_coeff,W.damtype) + src.hit_damage(W.force, W.damtype, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - return -/* - src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\The [W] bounces off [src.name] armor." - src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ - else - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) - src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) -*/ - return - + return /* /obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob) @@ -1665,8 +1699,8 @@ src.log_message("Attacked. Attacker - [user].",1) user.do_attack_animation(src) - if(!prob(src.deflect_chance*m_deflect_coeff)) - src.take_damage(damage*m_damage_coeff) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [attack_message] [src]!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") From c67b8c02a150e69d1c26528d26299d2a2f87502a Mon Sep 17 00:00:00 2001 From: LightningIron Date: Mon, 13 Jul 2015 18:25:34 -0500 Subject: [PATCH 04/32] Updates paths for armor boosters on map. --- maps/exodus-2.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 8a720e54b53..5e4bf6d432d 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -500,6 +500,7 @@ "jF" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"}) "jG" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jH" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/handcuffs,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck,/obj/item/weapon/rig/internalaffairs/equipped,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"jI" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "jJ" = (/obj/structure/closet/secure_closet/personal/patient,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "jK" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "jL" = (/obj/structure/window/shuttle{icon_state = "window2"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) @@ -1001,7 +1002,6 @@ "uZ" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "va" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) "vb" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vd" = (/obj/structure/table/rack,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "ve" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vf" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) @@ -2180,7 +2180,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvveuhvfvfvkvgvpvpvyvyyhzdyIyIyIyIvzvAvHvAvJtOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvvKuhuhuhuhuhuhuhuhuhyhyByIvMyIyIvEurururvOueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvPvbuvuwvQuhuhuhuhuhuhuhvRtvvSuhuhuhuhuhuhuhuhuhyhyHvTzqyIyIvzvAvHvAvJueufufufufpFvUumwhpFtWtWtWtWtWtxuguguguguguguowjuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvwluhuhuhuhuhuhuhtvwmuhuhuhuhvpwownwpwpyhzrzpzEyIyIyhwqwqwqtvuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbjItvwluhuhuhuhuhuhuhtvwmuhuhuhuhvpwownwpwpyhzrzpzEyIyIyhwqwqwqtvuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvuhuhuhuhwytvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvwzwAvlvmvntxufufuftxvlvmvowAwBtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbwEtvvxwPukxowVwXuhuhtvuhuhuhuhwYtvxawZwZxaxcxbxexdxQxQxQxQxQxgtvufufvBvCvCvCvCvCvCvCvCvCvDufufxhvqvqvqvqvqugvFuNuotxurururtxvGvGxkvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbxltvwFwGwGwGwItvuhuhtvuhuhuhuhxmtvuhxQxQxQxnxQxQxQxQxQxQxQxQxptvufJyvVvWvXvXvXvXvXvXvXvYueJyufugvZwawbwcwdugweuNwjtxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu From 6d25340bf5a9d51016a9e5e5d3cb4337c2dca91a Mon Sep 17 00:00:00 2001 From: LightningIron Date: Mon, 13 Jul 2015 19:00:48 -0500 Subject: [PATCH 05/32] Reverts mistaken change to energy relay charge rate. --- code/game/mecha/equipment/tools/tools.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index fecd5ea87e3..476e72607bc 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -765,7 +765,7 @@ pow_chan = c break if(pow_chan) - var/delta = ER.chassis.cell.maxcharge-cur_charge + var/delta = min(12, ER.chassis.cell.maxcharge-cur_charge) ER.chassis.give_power(delta) A.use_power(delta*ER.coeff, pow_chan) return @@ -1154,4 +1154,4 @@ if (OCCUPIED|LOCKED) usr << "All of the passenger compartments are already occupied or locked!" if (0) - usr << "\The [src] doesn't have a passenger compartment." + usr << "\The [src] doesn't have a passenger compartment." From 3841092127b9a7de9259ea5ab29af3432a6faaf8 Mon Sep 17 00:00:00 2001 From: LightningIron Date: Mon, 13 Jul 2015 23:42:29 -0500 Subject: [PATCH 06/32] Removes unused leftover var. --- code/game/mecha/mecha.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 73914c649d8..db259d7d22b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -24,7 +24,6 @@ var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/step_energy_drain = 10 - var/power_source = "cell" var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act. var/r_deflect_coeff = 1 From a9e03e1b947ea11fddf6d84705be9c04e30af80e Mon Sep 17 00:00:00 2001 From: LightningIron Date: Thu, 16 Jul 2015 20:46:14 -0500 Subject: [PATCH 07/32] Adds check to avoid potential runtimes and removes useless redefinition of check_equipment on armor boosters. --- code/game/mecha/equipment/tools/tools.dm | 48 ++++++++++++------------ 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 476e72607bc..ab62663905a 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -509,11 +509,6 @@ var/damage_coeff = 1 var/melee - can_attach(obj/mecha/M as obj) - if(..()) - return 1 - return 0 - attach(obj/mecha/M as obj) ..() activate_boost() @@ -530,15 +525,19 @@ return "* [src.name]" proc/activate_boost() - return + if(!src.chassis) + return 0 + return 1 proc/deactivate_boost() - return + if(!src.chassis) + return 0 + return 1 set_ready_state(state) if(state && !equip_ready) activate_boost() - else if(src.chassis && equip_ready) //check that the booster is still attached to something. + else if(equip_ready) deactivate_boost() ..() @@ -554,17 +553,17 @@ melee = 1 activate_boost() - chassis.m_deflect_coeff *= deflect_coeff - chassis.m_damage_coeff *= damage_coeff - chassis.mhit_power_use += energy_drain - ..() + if(..()) + chassis.m_deflect_coeff *= deflect_coeff + chassis.m_damage_coeff *= damage_coeff + chassis.mhit_power_use += energy_drain deactivate_boost() - chassis.m_deflect_coeff /= deflect_coeff - chassis.m_damage_coeff /= damage_coeff - chassis.mhit_power_use -= energy_drain - ..() + if(..()) + chassis.m_deflect_coeff /= deflect_coeff + chassis.m_damage_coeff /= damage_coeff + chassis.mhit_power_use -= energy_drain /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster @@ -578,17 +577,16 @@ melee = 0 activate_boost() - chassis.r_deflect_coeff *= deflect_coeff - chassis.r_damage_coeff *= damage_coeff - chassis.rhit_power_use += energy_drain - ..() - + if(..()) + chassis.r_deflect_coeff *= deflect_coeff + chassis.r_damage_coeff *= damage_coeff + chassis.rhit_power_use += energy_drain deactivate_boost() - chassis.r_deflect_coeff /= deflect_coeff - chassis.r_damage_coeff /= damage_coeff - chassis.rhit_power_use -= energy_drain - ..() + if(..()) + chassis.r_deflect_coeff /= deflect_coeff + chassis.r_damage_coeff /= damage_coeff + chassis.rhit_power_use -= energy_drain /obj/item/mecha_parts/mecha_equipment/repair_droid From 46a90b383ddad2689f0fd2772eb206164eb871fb Mon Sep 17 00:00:00 2001 From: LightningIron Date: Sun, 13 Sep 2015 21:20:37 -0500 Subject: [PATCH 08/32] Adjusts armor booster paths in mechfab_designs.dm. --- code/game/mecha/equipment/tools/tools.dm | 10 ---------- code/modules/research/mechfab_designs.dm | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 2cf7a58f085..a78ae006945 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -544,7 +544,6 @@ desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" origin_tech = list(TECH_MATERIAL = 3) - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) deflect_coeff = 1.15 damage_coeff = 0.8 melee = 1 @@ -568,18 +567,9 @@ desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate." icon_state = "mecha_abooster_proj" origin_tech = list(TECH_MATERIAL = 4) -<<<<<<< HEAD - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) deflect_coeff = 1.15 damage_coeff = 0.8 melee = 0 -======= - equip_cooldown = 10 - energy_drain = 50 - range = 0 - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 ->>>>>>> f57915ae5a5f7c21ac32772b6efe96f794aedd8d activate_boost() if(..()) diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index cfdce572b11..dad82751749 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -554,14 +554,14 @@ id = "mech_ccw_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster /datum/design/item/mecha/proj_armor desc = "Exosuit projectile armor booster." id = "mech_proj_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster /datum/design/item/mecha/diamond_drill name = "Diamond drill" From ad7c08fe4fa7a6b5682539a6b9858c8a3c098f63 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 21 Sep 2015 12:20:18 +0200 Subject: [PATCH 09/32] Uplink cost tweaking. Default starting telecrystal amount more than doubled. Mercenaries are now explicitly given 4 times the default telecrystal amount. Syndicate toolbox now includes insulated gloves instead of cables. General item cost tweak. --- code/__defines/gamemode.dm | 2 +- code/game/antagonist/outsider/mercenary.dm | 2 +- .../objects/items/devices/uplink_items.dm | 286 +++++++++--------- .../items/weapons/implants/implantuplink.dm | 3 +- .../objects/items/weapons/storage/toolbox.dm | 3 +- 5 files changed, 148 insertions(+), 148 deletions(-) diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 827737cf92a..7e2f316cc07 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -83,7 +83,7 @@ var/list/be_special_flags = list( #define MODE_MALFUNCTION "malf" #define MODE_TRAITOR "traitor" -#define DEFAULT_TELECRYSTAL_AMOUNT 12 +#define DEFAULT_TELECRYSTAL_AMOUNT 25 ///////////////// ////WIZARD ////// diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 7315eb418ff..2460345a34d 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -45,7 +45,7 @@ var/datum/antagonist/mercenary/mercs player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) if (player.mind == leader) - var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, 40) + var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT * 4) player.put_in_hands(U) player.update_icons() diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm index cddd87879df..735b27c6e44 100644 --- a/code/game/objects/items/devices/uplink_items.dm +++ b/code/game/objects/items/devices/uplink_items.dm @@ -39,8 +39,6 @@ var/datum/uplink/uplink = new() ..() antag_roles = list() - - /datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) var/extra_args = extra_args(user) if(!extra_args) @@ -144,44 +142,45 @@ datum/uplink_item/dd_SortValue() * Ammunition * *************/ /datum/uplink_item/item/ammo - item_cost = 2 + item_cost = 4 category = /datum/uplink_category/ammunition -/datum/uplink_item/item/ammo/a357 - name = ".357" - path = /obj/item/ammo_magazine/a357 - /datum/uplink_item/item/ammo/mc9mm name = "9mm" + item_cost = 1 path = /obj/item/ammo_magazine/mc9mm -/datum/uplink_item/item/ammo/darts - name = "Darts" - path = /obj/item/ammo_magazine/chemdart - -/datum/uplink_item/item/ammo/sniperammo - name = "14.5mm" - path = /obj/item/weapon/storage/box/sniperammo - /datum/uplink_item/item/ammo/a10mm name = "10mm" + item_cost = 1 path = /obj/item/ammo_magazine/a10mm +/datum/uplink_item/item/ammo/darts + name = "Darts" + item_cost = 1 + path = /obj/item/ammo_magazine/chemdart + +/datum/uplink_item/item/ammo/a357 + name = ".357" + item_cost = 2 + path = /obj/item/ammo_magazine/a357 + /datum/uplink_item/item/ammo/a762 name = "7.62mm" + item_cost = 3 path = /obj/item/ammo_magazine/a762 +/datum/uplink_item/item/ammo/sniperammo + name = "14.5mm" + item_cost = 4 + path = /obj/item/weapon/storage/box/sniperammo + /*************************************** * Highly Visible and Dangerous Weapons * ***************************************/ /datum/uplink_item/item/visible_weapons category = /datum/uplink_category/visible_weapons -/datum/uplink_item/item/visible_weapons/energy_sword - name = "Energy Sword" - item_cost = 4 - path = /obj/item/weapon/melee/energy/sword - /datum/uplink_item/item/visible_weapons/dartgun name = "Dart Gun" item_cost = 5 @@ -189,40 +188,45 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/visible_weapons/crossbow name = "Energy Crossbow" - item_cost = 5 + item_cost = 6 path = /obj/item/weapon/gun/energy/crossbow +/datum/uplink_item/item/visible_weapons/energy_sword + name = "Energy Sword" + item_cost = 8 + path = /obj/item/weapon/melee/energy/sword + /datum/uplink_item/item/visible_weapons/g9mm name = "Silenced 9mm" - item_cost = 5 + item_cost = 8 path = /obj/item/weapon/storage/box/syndie_kit/g9mm /datum/uplink_item/item/visible_weapons/riggedlaser - name = "Exosuit Rigged Laser" - item_cost = 6 + name = "Exosuit (APLU) Rigged Laser" + item_cost = 8 path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser /datum/uplink_item/item/visible_weapons/revolver name = "Revolver" - item_cost = 6 + item_cost = 12 path = /obj/item/weapon/gun/projectile/revolver +//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. +/datum/uplink_item/item/visible_weapons/submachinegun + name = "Submachine Gun" + item_cost = 12 + path = /obj/item/weapon/gun/projectile/automatic/c20r + +/datum/uplink_item/item/visible_weapons/assaultrifle + name = "Assault Rifle" + item_cost = 14 + path = /obj/item/weapon/gun/projectile/automatic/sts35 + /datum/uplink_item/item/visible_weapons/heavysniper name = "Anti-materiel Rifle" item_cost = DEFAULT_TELECRYSTAL_AMOUNT path = /obj/item/weapon/gun/projectile/heavysniper -//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. -/datum/uplink_item/item/visible_weapons/submachinegun - name = "Submachine Gun" - item_cost = 6 - path = /obj/item/weapon/gun/projectile/automatic/c20r - -/datum/uplink_item/item/visible_weapons/assaultrifle - name = "Assault Rifle" - item_cost = 7 - path = /obj/item/weapon/gun/projectile/automatic/sts35 - /************************************* * Stealthy and Inconspicuous Weapons * *************************************/ @@ -234,45 +238,40 @@ datum/uplink_item/dd_SortValue() item_cost = 1 path = /obj/item/weapon/soap/syndie +/datum/uplink_item/item/stealthy_weapons/cigarette_kit + name = "Cigarette Kit" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/cigarette + /datum/uplink_item/item/stealthy_weapons/concealed_cane name = "Concealed Cane Sword" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/cane/concealed +/datum/uplink_item/item/stealthy_weapons/random_toxin + name = "Random Toxin - Beaker" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/toxin + /datum/uplink_item/item/stealthy_weapons/detomatix name = "Detomatix PDA Cartridge" - item_cost = 3 + item_cost = 4 path = /obj/item/weapon/cartridge/syndicate /datum/uplink_item/item/stealthy_weapons/parapen name = "Paralysis Pen" - item_cost = 3 + item_cost = 6 path = /obj/item/weapon/pen/reagent/paralysis -/datum/uplink_item/item/stealthy_weapons/cigarette_kit - name = "Cigarette Kit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/cigarette - -/datum/uplink_item/item/stealthy_weapons/random_toxin - name = "Random Toxin - Beaker" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/toxin - /******************************* * Stealth and Camouflage Items * *******************************/ /datum/uplink_item/item/stealth_items category = /datum/uplink_category/stealth_items -/datum/uplink_item/item/stealth_items/id - name = "Agent ID card" - item_cost = 2 - path = /obj/item/weapon/card/id/syndicate - /datum/uplink_item/item/stealth_items/syndigaloshes name = "No-Slip Shoes" - item_cost = 2 + item_cost = 1 path = /obj/item/clothing/shoes/syndigaloshes /datum/uplink_item/item/stealth_items/spy @@ -280,24 +279,19 @@ datum/uplink_item/dd_SortValue() item_cost = 2 path = /obj/item/weapon/storage/box/syndie_kit/spy +/datum/uplink_item/item/stealth_items/id + name = "Agent ID card" + item_cost = 3 + path = /obj/item/weapon/card/id/syndicate + /datum/uplink_item/item/stealth_items/chameleon_kit name = "Chameleon Kit" - item_cost = 3 + item_cost = 5 path = /obj/item/weapon/storage/box/syndie_kit/chameleon -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - /datum/uplink_item/item/stealth_items/voice name = "Voice Changer" - item_cost = 4 + item_cost = 5 path = /obj/item/clothing/mask/gas/voice /datum/uplink_item/item/stealth_items/camera_floppy @@ -305,6 +299,11 @@ datum/uplink_item/dd_SortValue() item_cost = 6 path = /obj/item/weapon/disk/file/cameras/syndicate +/datum/uplink_item/item/stealth_items/chameleon_projector + name = "Chameleon-Projector" + item_cost = 8 + path = /obj/item/device/chameleon + /******************** * Devices and Tools * ********************/ @@ -313,78 +312,78 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/tools/toolbox name = "Fully Loaded Toolbox" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/storage/toolbox/syndicate -/datum/uplink_item/item/tools/plastique - name = "C-4 (Destroys walls)" +/datum/uplink_item/item/tools/money + name = "Operations Funding" item_cost = 2 - path = /obj/item/weapon/plastique - -/datum/uplink_item/item/tools/encryptionkey_radio - name = "Encrypted Radio Channel Key" - item_cost = 2 - path = /obj/item/device/encryptionkey/syndicate - -/datum/uplink_item/item/tools/encryptionkey_binary - name = "Binary Translator Key" - item_cost = 3 - path = /obj/item/device/encryptionkey/binary - -/datum/uplink_item/item/tools/emag - name = "Cryptographic Sequencer" - item_cost = 3 - path = /obj/item/weapon/card/emag + path = /obj/item/weapon/storage/secure/briefcase/money + desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." /datum/uplink_item/item/tools/clerical name = "Morphic Clerical Kit" item_cost = 3 path = /obj/item/weapon/storage/box/syndie_kit/clerical -/datum/uplink_item/item/tools/space_suit - name = "Space Suit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/space - -/datum/uplink_item/item/tools/thermal - name = "Thermal Imaging Glasses" - item_cost = 3 - path = /obj/item/clothing/glasses/thermal/syndi +/datum/uplink_item/item/tools/plastique + name = "C-4 (Destroys walls)" + item_cost = 4 + path = /obj/item/weapon/plastique /datum/uplink_item/item/tools/heavy_vest name = "Heavy Armor Vest" item_cost = 4 path = /obj/item/clothing/suit/storage/vest/heavy/merc +/datum/uplink_item/item/tools/encryptionkey_radio + name = "Encrypted Radio Channel Key" + item_cost = 4 + path = /obj/item/device/encryptionkey/syndicate + +/datum/uplink_item/item/tools/encryptionkey_binary + name = "Binary Translator Key" + item_cost = 5 + path = /obj/item/device/encryptionkey/binary + +/datum/uplink_item/item/tools/emag + name = "Cryptographic Sequencer" + item_cost = 6 + path = /obj/item/weapon/card/emag + +/datum/uplink_item/item/tools/space_suit + name = "Space Suit" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/space + +/datum/uplink_item/item/tools/thermal + name = "Thermal Imaging Glasses" + item_cost = 6 + path = /obj/item/clothing/glasses/thermal/syndi + /datum/uplink_item/item/tools/powersink name = "Powersink (DANGER!)" - item_cost = 5 + item_cost = 10 path = /obj/item/device/powersink -/datum/uplink_item/item/tools/ai_module - name = "Hacked AI Upload Module" - item_cost = 7 - path = /obj/item/weapon/aiModule/syndicate - -/datum/uplink_item/item/tools/supply_beacon - name = "Hacked Supply Beacon (DANGER!)" - item_cost = 7 - path = /obj/item/supply_beacon - /datum/uplink_item/item/tools/teleporter name = "Teleporter Circuit Board" - item_cost = 20 + item_cost = 10 path = /obj/item/weapon/circuitboard/teleporter /datum/uplink_item/item/tools/teleporter/New() ..() antag_roles = list(MODE_MERCENARY) -/datum/uplink_item/item/tools/money - name = "Operations Funding" - item_cost = 3 - path = /obj/item/weapon/storage/secure/briefcase/money - desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." +/datum/uplink_item/item/tools/ai_module + name = "Hacked AI Upload Module" + item_cost = 14 + path = /obj/item/weapon/aiModule/syndicate + +/datum/uplink_item/item/tools/supply_beacon + name = "Hacked Supply Beacon (DANGER!)" + item_cost = 14 + path = /obj/item/supply_beacon /*********** * Implants * @@ -394,24 +393,28 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/implants/imp_freedom name = "Freedom Implant" - item_cost = 3 + item_cost = 6 path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom /datum/uplink_item/item/implants/imp_compress name = "Compressed Matter Implant" - item_cost = 4 + item_cost = 8 path = /obj/item/weapon/storage/box/syndie_kit/imp_compress /datum/uplink_item/item/implants/imp_explosive name = "Explosive Implant (DANGER!)" - item_cost = 6 + item_cost = 10 path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive /datum/uplink_item/item/implants/imp_uplink - name = "Uplink Implant (Contains 5 Telecrystals)" - item_cost = 10 + name = "Uplink Implant" path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink +/datum/uplink_item/item/implants/imp_uplink/New() + ..() + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) + desc = "Contains [round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8)] Telecrystal\s" + /********** * Medical * **********/ @@ -420,17 +423,17 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/medical/sinpockets name = "Box of Sin-Pockets" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/storage/box/sinpockets /datum/uplink_item/item/medical/surgery name = "Surgery kit" - item_cost = 6 + item_cost = 10 path = /obj/item/weapon/storage/firstaid/surgery /datum/uplink_item/item/medical/combat name = "Combat medical kit" - item_cost = 6 + item_cost = 12 path = /obj/item/weapon/storage/firstaid/combat /******************* @@ -441,37 +444,37 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/hardsuit_modules/thermal name = "Thermal Scanner" - item_cost = 2 + item_cost = 4 path = /obj/item/rig_module/vision/thermal /datum/uplink_item/item/hardsuit_modules/energy_net name = "Net Projector" - item_cost = 3 + item_cost = 5 path = /obj/item/rig_module/fabricator/energy_net /datum/uplink_item/item/ewar_voice name = "Electrowarfare Suite and Voice Synthesiser" - item_cost = 4 + item_cost = 6 path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice /datum/uplink_item/item/hardsuit_modules/maneuvering_jets name = "Maneuvering Jets" - item_cost = 4 + item_cost = 8 path = /obj/item/rig_module/maneuvering_jets /datum/uplink_item/item/hardsuit_modules/egun name = "Mounted Energy Gun" - item_cost = 6 + item_cost = 12 path = /obj/item/rig_module/mounted/egun /datum/uplink_item/item/hardsuit_modules/power_sink name = "Power Sink" - item_cost = 6 + item_cost = 12 path = /obj/item/rig_module/power_sink /datum/uplink_item/item/hardsuit_modules/laser_canon name = "Mounted Laser Cannon" - item_cost = 8 + item_cost = 16 path = /obj/item/rig_module/mounted /*********** @@ -482,19 +485,19 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/grenades/anti_photon name = "5xPhoton Disruption Grenades" - item_cost = 2 + item_cost = 4 path = /obj/item/weapon/storage/box/anti_photons -/datum/uplink_item/item/grenades/emp - name = "5xEMP Grenades" - item_cost = 3 - path = /obj/item/weapon/storage/box/emps - /datum/uplink_item/item/grenades/smoke name = "5xSmoke Grenades" - item_cost = 2 + item_cost = 4 path = /obj/item/weapon/storage/box/smokes +/datum/uplink_item/item/grenades/emp + name = "5xEMP Grenades" + item_cost = 6 + path = /obj/item/weapon/storage/box/emps + /************ * Badassery * ************/ @@ -550,8 +553,8 @@ datum/uplink_item/dd_SortValue() ****************/ /datum/uplink_item/item/badassery/surplus name = "Surplus Crate" - item_cost = 40 - var/item_worth = 60 + item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4 + var/item_worth = DEFAULT_TELECRYSTAL_AMOUNT * 6 var/icon /datum/uplink_item/item/badassery/surplus/New() @@ -598,14 +601,11 @@ var/image/default_abstract_uplink_icon if(.) log_and_message_admins("has triggered a falsified [src]", user) -/datum/uplink_item/abstract/announcements/fake_centcom - item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2 - /datum/uplink_item/abstract/announcements/fake_centcom/New() ..() name = "[command_name()] Update Announcement" + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." - antag_roles = list(MODE_MERCENARY) /datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) command_announcement.Announce(args.["message"], args.["title"]) @@ -614,7 +614,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_crew_arrival name = "Crew Arrival Announcement/Records" desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!" - item_cost = 4 + item_cost = 8 /datum/uplink_item/abstract/announcements/fake_crew_arrival/New() ..() @@ -676,7 +676,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_ion_storm name = "Ion Storm Announcement" desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." - item_cost = 1 + item_cost = 2 /datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc) ion_storm_announcement() @@ -685,7 +685,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_radiation name = "Radiation Storm Announcement" desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." - item_cost = 3 + item_cost = 6 /datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc) var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0) diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 0469cd56d5c..9e30764119a 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -6,7 +6,7 @@ /obj/item/weapon/implant/uplink/New() activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") hidden_uplink = new(src) - hidden_uplink.uses = 5 + hidden_uplink.uses = round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8) ..() return @@ -14,6 +14,7 @@ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." + hidden_uplink.uplink_owner = source.mind return 1 diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 11c2d6a8539..02ce84f0726 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -72,11 +72,10 @@ New() ..() - var/color = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/clothing/gloves/yellow(src) new /obj/item/weapon/screwdriver(src) new /obj/item/weapon/wrench(src) new /obj/item/weapon/weldingtool(src) new /obj/item/weapon/crowbar(src) - new /obj/item/stack/cable_coil(src,30,color) new /obj/item/weapon/wirecutters(src) new /obj/item/device/multitool(src) From 6e69442545e74e8333b7937871bbe8c0bd3ffef9 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 21 Nov 2015 11:06:08 +0100 Subject: [PATCH 10/32] Replaces 'in world' arguments. Arguments acquired from 'in world' cannot be GCd for several minutes due to a hidden reference from usr to the argument itself. This replaces all 'in world' arguments with 'in range(world.view)', with the notable exception of "View Variables". --- code/ATMOSPHERICS/_atmospherics_helpers.dm | 2 +- code/modules/admin/admin_report.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/callproc/callproc.dm | 2 +- code/modules/admin/verbs/adminjump.dm | 2 +- code/modules/admin/verbs/debug.dm | 8 ++++---- code/modules/admin/verbs/modifyvariables.dm | 2 +- code/modules/admin/verbs/possess.dm | 4 ++-- code/modules/admin/verbs/randomverbs.dm | 6 +++--- code/modules/admin/view_variables/view_variables.dm | 1 + code/modules/mob/living/silicon/pai/admin.dm | 2 +- 11 files changed, 17 insertions(+), 16 deletions(-) diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index 6fc2b923dd1..26740301ff1 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -15,7 +15,7 @@ /obj/machinery/atmospherics/var/debug = 0 -/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in view()) +/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in range(world.view)) set name = "Toggle Debug Messages" set category = "Debug" M.debug = !M.debug diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index c5cff737ee1..9bc1c91ef3f 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -118,7 +118,7 @@ client/proc/display_admin_reports() usr << browse(output, "window=news;size=600x400") -client/proc/Report(mob/M as mob in world) +client/proc/Report(mob/M as mob in mob_list) set category = "Admin" if(!src.holder) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 977e79bd28d..71654c31d25 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -640,7 +640,7 @@ var/list/admin_verbs_mentor = list( log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) -/client/proc/make_sound(var/obj/O in world) // -- TLE +/client/proc/make_sound(var/obj/O in range(world.view)) // -- TLE set category = "Special Verbs" set name = "Make Sound" set desc = "Display a message to everyone who can hear the target" diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 9b3da2b92fe..41b8998c30a 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -33,7 +33,7 @@ callproc_targetpicked(targetselected, target) -/client/proc/callproc_target(atom/A in world) +/client/proc/callproc_target(atom/A in range(world.view)) set category = "Debug" set name = "Advanced ProcCall Target" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index e579ca15444..a8d98beaf0d 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -21,7 +21,7 @@ else alert("Admin jumping disabled") -/client/proc/jumptoturf(var/turf/T in world) +/client/proc/jumptoturf(var/turf/T in turfs) set name = "Jump to Turf" set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 9154badcc6b..7c4a74d65d6 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -119,7 +119,7 @@ alert("Invalid mob") /* -/client/proc/cmd_admin_monkeyize(var/mob/M in world) +/client/proc/cmd_admin_monkeyize(var/mob/M in mob_list) set category = "Fun" set name = "Make Monkey" @@ -134,7 +134,7 @@ else alert("Invalid mob") -/client/proc/cmd_admin_changelinginize(var/mob/M in world) +/client/proc/cmd_admin_changelinginize(var/mob/M in mob_list) set category = "Fun" set name = "Make Changeling" @@ -152,7 +152,7 @@ alert("Invalid mob") */ /* -/client/proc/cmd_admin_abominize(var/mob/M in world) +/client/proc/cmd_admin_abominize(var/mob/M in mob_list) set category = null set name = "Make Abomination" @@ -169,7 +169,7 @@ */ /* -/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist +/client/proc/make_cultist(var/mob/M in mob_list) // -- TLE, modified by Urist set category = "Fun" set name = "Make Cultist" set desc = "Makes target a cultist" diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 50ddc81f41b..713b8f6a51d 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -9,7 +9,7 @@ var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays") var/list/VVckey_edit = list("key", "ckey") /* -/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) +/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) // Acceptable 'in world', as VV would be incredibly hampered otherwise set category = "Debug" set name = "Edit Variables" set desc="(target) Edit a target item's variables" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 6de30853ce6..a9787261004 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -1,4 +1,4 @@ -/proc/possess(obj/O as obj in world) +/proc/possess(obj/O as obj in range(world.view)) set name = "Possess Obj" set category = "Object" @@ -26,7 +26,7 @@ usr.control_object = O feedback_add_details("admin_verb","PO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/proc/release(obj/O as obj in world) +/proc/release(obj/O as obj in range(world.view)) set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ba00a930b39..6924b2b716f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -536,7 +536,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in range(world.view)) set category = "Admin" set name = "Delete" @@ -562,7 +562,7 @@ Traitors and the like can also be revived with the previous role mostly intact. src << "[job.title]: [job.total_positions]" feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "Explosion" @@ -590,7 +590,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else return -/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "EM Pulse" diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index e624d2df05a..09505ac5771 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -6,6 +6,7 @@ // Variables not to expand the lists of. Vars is pointless to expand, and overlays/underlays cannot be expanded. /var/list/view_variables_dont_expand = list("overlays", "underlays", "vars") +// Acceptable 'in world', as VV would be incredibly hampered otherwise /client/proc/debug_variables(datum/D in world) set category = "Debug" set name = "View Variables" diff --git a/code/modules/mob/living/silicon/pai/admin.dm b/code/modules/mob/living/silicon/pai/admin.dm index 069c5d2c684..da136c78f14 100644 --- a/code/modules/mob/living/silicon/pai/admin.dm +++ b/code/modules/mob/living/silicon/pai/admin.dm @@ -1,5 +1,5 @@ // Originally a debug verb, made it a proper adminverb for ~fun~ -/client/proc/makePAI(turf/t in view(), name as text, pai_key as null|text) +/client/proc/makePAI(turf/t in range(world.view), name as text, pai_key as null|text) set name = "Make pAI" set category = "Admin" From ed17e487ca9680b186e315ebfe844ba6b1be7204 Mon Sep 17 00:00:00 2001 From: LightningIron Date: Fri, 27 Nov 2015 17:21:07 -0600 Subject: [PATCH 11/32] Adds indents to make a spawn() work properly. --- code/game/mecha/equipment/mecha_equipment.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index ec97a779c58..c9974cb76df 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -18,10 +18,10 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1) spawn(equip_cooldown) - set_ready_state(1) - if(target && chassis) - return 1 - return 0 + set_ready_state(1) + if(target && chassis) + return 1 + return 0 /obj/item/mecha_parts/mecha_equipment/New() From 7803da0e119c918a3e9fb086b8d4508d47b1fe6b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 1 Dec 2015 12:15:07 +0100 Subject: [PATCH 12/32] The AI can now toggle hologram eye tracking. Allows the AI to use the "Toggle Hologram Movement" verb to toggle whether the hologram should follow the AI eye or not. Also adds a check to ensure that the holopad can see the hologram, otherwise it shuts down. Partial port of https://github.com/PolarisSS13/Polaris/pull/11. --- code/game/machinery/hologram.dm | 26 +++++++++++++++--------- code/modules/mob/freelook/ai/eye.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 13 +++++++++++- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5f57174074a..d7c037839d8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -146,22 +146,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/process() for (var/mob/living/silicon/ai/master in masters) - var/active_ai = (master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + var/active_ai = (master && !master.incapacitated() && master.client && master.eyeobj)//If there is an AI with an eye attached, it's not incapacitated, and it has a client if((stat & NOPOWER) || !active_ai) clear_holo(master) continue - if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range))) + if(!(masters[master] in view(src))) clear_holo(master) continue - if(HOLOPAD_MODE == AREA_BASED) - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) - if(eye_area != holo_area) - clear_holo(master) - continue - use_power(power_per_hologram) return 1 @@ -169,8 +162,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[user]) step_to(masters[user], user.eyeobj) // So it turns. var/obj/effect/overlay/H = masters[user] - H.loc = get_turf(user.eyeobj) + H.forceMove(get_turf(user.eyeobj)) masters[user] = H + + if(!(H in view(src))) + clear_holo(user) + return 0 + + if((HOLOPAD_MODE == RANGE_BASED && (get_dist(user.eyeobj, src) > holo_range))) + clear_holo(user) + + if(HOLOPAD_MODE == AREA_BASED) + var/area/holo_area = get_area(src) + var/area/hologram_area = get_area(H) + if(hologram_area != holo_area) + clear_holo(user) return 1 /* diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 93fda30055e..461f3451379 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -18,7 +18,7 @@ ai.ai_cancel_tracking() //Holopad - if(ai.holo) + if(ai.holo && ai.hologram_follow) ai.holo.move_hologram(ai) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5d3cf1a74c7..72ee2ce2318 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -23,7 +23,8 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/sensor_mode, /mob/living/silicon/ai/proc/show_laws_verb, /mob/living/silicon/ai/proc/toggle_acceleration, - /mob/living/silicon/ai/proc/toggle_camera_light + /mob/living/silicon/ai/proc/toggle_camera_light, + /mob/living/silicon/ai/proc/toggle_hologram_movement ) //Not sure why this is necessary... @@ -61,6 +62,7 @@ var/list/ai_verbs_default = list( var/control_disabled = 0 var/datum/announcement/priority/announcement var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object. + var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not //NEWMALF VARIABLES var/malfunctioning = 0 // Master var that determines if AI is malfunctioning. @@ -203,6 +205,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/Destroy() ai_list -= src qdel(eyeobj) + eyeobj = null ..() /mob/living/silicon/ai/proc/setup_icon() @@ -644,6 +647,14 @@ var/list/ai_verbs_default = list( set desc = "Augment visual feed with internal sensor overlays" toggle_sensor_mode() +/mob/living/silicon/ai/proc/toggle_hologram_movement() + set name = "Toggle Hologram Movement" + set category = "AI Commands" + set desc = "Toggles hologram movement based on moving with your virtual eye." + + hologram_follow = !hologram_follow + usr << "Your hologram will now [hologram_follow ? "follow" : "no longer follow"] you." + /mob/living/silicon/ai/proc/check_unable(var/flags = 0, var/feedback = 1) if(stat == DEAD) if(feedback) src << "You are dead!" From 3f81dc8b6e95d4b2515471d21dbf7dbd24ac7822 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 1 Dec 2015 12:18:21 +0100 Subject: [PATCH 13/32] Changelog entry. --- html/changelogs/PsiOmegaDelta-HoloMovement.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/PsiOmegaDelta-HoloMovement.yml diff --git a/html/changelogs/PsiOmegaDelta-HoloMovement.yml b/html/changelogs/PsiOmegaDelta-HoloMovement.yml new file mode 100644 index 00000000000..69d18448c0b --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-HoloMovement.yml @@ -0,0 +1,4 @@ +author: Neerti +delete-after: True +changes: + - rscadd: "The AI can now toggle whether its hologram will move towards the center of its view using the 'Toggle Hologram Movement' verb." From a32be3f359aba5a9059f706c6974dcde4f889eb1 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 1 Dec 2015 15:37:28 +0100 Subject: [PATCH 14/32] Adds the ability to have random lobby screens. A random lobby screen is now picked at server start, and presented to all players. Sadly in our case we currently only have one every day lobby screen. Port of https://github.com/PolarisSS13/Polaris/pull/321, with added sanity checking. --- code/controllers/configuration.dm | 5 +++++ code/modules/mob/new_player/login.dm | 19 ++++++++++++++++++- config/example/config.txt | 4 ++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index ad0eaa689d8..5d740386b1f 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -6,6 +6,8 @@ var/list/gamemode_cache = list() var/nudge_script_path = "nudge.py" // where the nudge.py script is located + var/list/lobby_screens = list("title") // Which lobby screens are available + var/log_ooc = 0 // log OOC channel var/log_access = 0 // log login/logout var/log_say = 0 // log client say @@ -694,6 +696,9 @@ var/list/gamemode_cache = list() if(values.len > 0) language_prefixes = values + if ("lobby_screens") + config.lobby_screens = text2list(value, ";") + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index da27c1102f7..1686416bcce 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -1,5 +1,22 @@ +/var/obj/effect/lobby_image = new/obj/effect/lobby_image() -/var/atom/movable/lobby_image = new /atom/movable{icon = 'icons/misc/title.dmi'; icon_state = "title"; screen_loc = "1,1"; name = "Baystation12"} +/obj/effect/lobby_image + name = "Baystation12" + desc = "This shouldn't be read" + icon = 'icons/misc/title.dmi' + screen_loc = "WEST,SOUTH" + +/obj/effect/lobby_image/initialize() + var/list/known_icon_states = icon_states(icon) + for(var/lobby_screen in config.lobby_screens) + if(!(lobby_screen in known_icon_states)) + error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].") + config.lobby_screens -= lobby_screen + + if(config.lobby_screens.len) + icon_state = pick(config.lobby_screens) + else + icon_state = known_icon_states[1] /mob/new_player var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled diff --git a/config/example/config.txt b/config/example/config.txt index 96015272210..01e684a4a67 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -385,3 +385,7 @@ STARLIGHT 0 ## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and - # DEFAULT_LANGUAGE_PREFIXES , # - + +## A ; separated list of lobby screens to randomly pick from. The listed screens must exist as icon states in '/icons/misc/title.dmi'. +## Defaults to 'title' if left unset. +# LOBBY_SCREENS title From e83a8adc2c453e50e3fcbc64a563cc6b7e281d6b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 17:32:32 +1030 Subject: [PATCH 15/32] Generalizes the accessory system to work for suits. --- baystation12.dme | 1 + code/modules/clothing/clothing.dm | 107 +++--------------- code/modules/clothing/clothing_accessories.dm | 100 ++++++++++++++++ code/modules/clothing/spacesuits/void/void.dm | 5 +- .../clothing/under/accessories/accessory.dm | 21 ++-- .../mob/living/carbon/human/update_icons.dm | 6 + html/changelogs/Zuhayr-accessorizing.yml | 5 + 7 files changed, 143 insertions(+), 102 deletions(-) create mode 100644 code/modules/clothing/clothing_accessories.dm create mode 100644 html/changelogs/Zuhayr-accessorizing.yml diff --git a/baystation12.dme b/baystation12.dme index ca75948dfff..7d581db78cb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -994,6 +994,7 @@ #include "code\modules\client\preference_setup\skills\skills.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\ears\skrell.dm" #include "code\modules\clothing\glasses\glasses.dm" #include "code\modules\clothing\glasses\hud.dm" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 681b33d6892..81d9bc4a8c7 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -6,6 +6,10 @@ var/list/species_restricted = null //Only these species can wear this kit. var/gunshot_residue //Used by forensics. + var/list/accessories = list() + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + /* Sprites used when the clothing item is refit. This is done by setting icon_override. For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. @@ -509,7 +513,6 @@ BLIND // can't see anything 2 = Report detailed damages 3 = Report location */ - var/list/accessories = list() var/displays_id = 1 var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list( @@ -520,6 +523,15 @@ BLIND // can't see anything //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null + valid_accessory_slots = list("utility","armband","decor") + restricted_accessory_slots = list("utility", "armband") + + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(accessories && accessories.len) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return /obj/item/clothing/under/New() ..() @@ -563,69 +575,6 @@ BLIND // can't see anything var/mob/M = src.loc M.update_inv_w_uniform() -/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) - if(istype(A)) - .=1 - else - return 0 - if(accessories.len && (A.slot in list("utility","armband"))) - for(var/obj/item/clothing/accessory/AC in accessories) - if (AC.slot == A.slot) - return 0 - -/obj/item/clothing/under/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/clothing/accessory)) - var/obj/item/clothing/accessory/A = I - if(can_attach_accessory(A)) - user.drop_item() - accessories += A - A.on_attached(src, user) - - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() - - return - else - user << "You cannot attach more accessories of this type to [src]." - - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.attackby(I, user) - return - - ..() - -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || issmall(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if (!(src.loc == usr)) - return - - if (( usr.restrained() ) || ( usr.stat )) - return - - if (!usr.unEquip(src)) - return - - switch(over_object.name) - if("r_hand") - usr.put_in_r_hand(src) - if("l_hand") - usr.put_in_l_hand(src) - src.add_fingerprint(usr) /obj/item/clothing/under/examine(mob/user) ..(user) @@ -638,9 +587,6 @@ BLIND // can't see anything user << "Its vital tracker appears to be enabled." if(3) user << "Its vital tracker and tracking beacon appear to be enabled." - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - user << "\A [A] is attached to it." /obj/item/clothing/under/proc/set_sensors(mob/usr as mob) var/mob/M = usr @@ -713,34 +659,7 @@ BLIND // can't see anything item_state_slots[slot_w_uniform_str] = "[worn_state]" update_clothing_icon() -/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) - if(!(A in accessories)) - return - - A.on_removed(user) - accessories -= A - update_clothing_icon() - -/obj/item/clothing/under/verb/removetie() - set name = "Remove Accessory" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - if(!accessories.len) return - var/obj/item/clothing/accessory/A - if(accessories.len > 1) - A = input("Select an accessory to remove from [src]") as null|anything in accessories - else - A = accessories[1] - src.remove_accessory(usr,A) /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() - -/obj/item/clothing/under/emp_act(severity) - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.emp_act(severity) - ..() \ No newline at end of file diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm new file mode 100644 index 00000000000..57e22d6ba04 --- /dev/null +++ b/code/modules/clothing/clothing_accessories.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A) + if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots)) + .=1 + else + return 0 + if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots)) + for(var/obj/item/clothing/accessory/AC in accessories) + if (AC.slot == A.slot) + return 0 + +/obj/item/clothing/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/clothing/accessory)) + + if(!valid_accessory_slots || !valid_accessory_slots.len) + usr << "You cannot attach accessories of any kind to \the [src]." + return + + var/obj/item/clothing/accessory/A = I + if(can_attach_accessory(A)) + user.drop_item() + accessories += A + A.on_attached(src, user) + src.verbs |= /obj/item/clothing/proc/removetie_verb + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform() + return + else + user << "You cannot attach more accessories of this type to [src]." + return + + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.attackby(I, user) + return + + ..() + +/obj/item/clothing/attack_hand(var/mob/user) + //only forward to the attached accessory if the clothing is equipped (not in a storage) + if(accessories.len && src.loc == user) + for(var/obj/item/clothing/accessory/A in accessories) + A.attack_hand(user) + return + return ..() + +/obj/item/clothing/MouseDrop(var/obj/over_object) + if (ishuman(usr) || issmall(usr)) + //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. + if (!(src.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if (!usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.put_in_r_hand(src) + if("l_hand") + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + +/obj/item/clothing/examine(var/mob/user) + ..(user) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + user << "\A [A] is attached to it." + +/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) + if(!(A in accessories)) + return + + A.on_removed(user) + accessories -= A + update_clothing_icon() + +/obj/item/clothing/proc/removetie_verb() + set name = "Remove Accessory" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + if(!accessories.len) return + var/obj/item/clothing/accessory/A + if(accessories.len > 1) + A = input("Select an accessory to remove from [src]") as null|anything in accessories + else + A = accessories[1] + src.remove_accessory(usr,A) + if(!accessories.len) + src.verbs -= /obj/item/clothing/proc/removetie_verb + +/obj/item/clothing/emp_act(severity) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.emp_act(severity) + ..() \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 2c6d761a7a6..86edeca84dd 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -186,8 +186,11 @@ if(!istype(user,/mob/living)) return + if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler)) + return ..() + if(istype(src.loc,/mob/living)) - user << "How do you propose to modify a voidsuit while it is being worn?" + user << "You cannot modify \the [src] while it is being worn." return if(istype(W,/obj/item/weapon/screwdriver)) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index bdc9f33a2e9..0f4ec46c941 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -7,16 +7,20 @@ slot_flags = SLOT_TIE w_class = 2.0 var/slot = "decor" - var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to + var/obj/item/clothing/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. var/image/mob_overlay = null var/overlay_state = null +/obj/item/clothing/accessory/Destroy() + on_removed() + return ..() + /obj/item/clothing/accessory/proc/get_inv_overlay() if(!inv_overlay) if(!mob_overlay) get_mob_overlay() - + var/tmp_icon_state = "[overlay_state? "[overlay_state]" : "[icon_state]"]" if(icon_override) if("[tmp_icon_state]_tie" in icon_states(icon_override)) @@ -36,23 +40,26 @@ return mob_overlay //when user attached an accessory to S -/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob) +/obj/item/clothing/accessory/proc/on_attached(var/obj/item/clothing/S, var/mob/user) if(!istype(S)) return has_suit = S loc = has_suit has_suit.overlays += get_inv_overlay() - user << "You attach [src] to [has_suit]." + user << "You attach \the [src] to \the [has_suit]." src.add_fingerprint(user) -/obj/item/clothing/accessory/proc/on_removed(mob/user as mob) +/obj/item/clothing/accessory/proc/on_removed(var/mob/user) if(!has_suit) return has_suit.overlays -= get_inv_overlay() has_suit = null - usr.put_in_hands(src) - src.add_fingerprint(user) + if(user) + usr.put_in_hands(src) + src.add_fingerprint(user) + else + src.forceMove(get_turf(src)) //default attackby behaviour /obj/item/clothing/accessory/attackby(obj/item/I, mob/user) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9140428d790..dcd7e06f235 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -770,6 +770,12 @@ var/global/list/damage_icon_parts = list() bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies + // Accessories - copied from uniform, BOILERPLATE because fuck this system. + var/obj/item/clothing/suit/suit = wear_suit + if(istype(suit) && suit.accessories.len) + for(var/obj/item/clothing/accessory/A in suit.accessories) + standing.overlays |= A.get_mob_overlay() + overlays_standing[SUIT_LAYER] = standing update_tail_showing(0) diff --git a/html/changelogs/Zuhayr-accessorizing.yml b/html/changelogs/Zuhayr-accessorizing.yml new file mode 100644 index 00000000000..88048209879 --- /dev/null +++ b/html/changelogs/Zuhayr-accessorizing.yml @@ -0,0 +1,5 @@ +author: Zuhayr +delete-after: True +changes: + - tweak: "Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set." + From 22ac269692b032208f26a0a45eaaf2dc04756e85 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 09:16:07 +1030 Subject: [PATCH 16/32] Emergency fix for HasProximity being passed a turf. (cherry picked from commit 622fb93a3ec52b4c6fbff1c96ea576a1a24d71ac) --- code/modules/assembly/proximity.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index cfc46a86a5c..2b71743416e 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -40,6 +40,9 @@ HasProximity(atom/movable/AM as mob|obj) + if(!istype(AM)) + log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).") + return if (istype(AM, /obj/effect/beam)) return if (AM.move_speed < 12) sense() return From a90c2ca07789a834e14d39af9cf11cf34b2e1c05 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 09:29:31 +1030 Subject: [PATCH 17/32] Runtime fixes. (cherry picked from commit 0cf0b726608ca07ae456441355b399095f21dffc) --- code/game/turfs/turf.dm | 2 +- code/modules/assembly/infrared.dm | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 595c239ee49..3eb48aa0e79 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,7 +140,7 @@ var/const/enterloopsanity = 100 ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) - for(var/atom/thing as mob|obj|turf|area in range(1)) + for(var/atom/movable/thing in range(1)) if(objects > enterloopsanity) break objects++ spawn(0) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index b03c148026c..f448ce35a11 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -187,13 +187,10 @@ return /obj/effect/beam/i_beam/process() - //world << "i_beam \ref[src] : process" - if((loc.density || !(master))) - // world << "beam hit loc [loc] or no master [master], deleting" + if((loc && loc.density) || !master) qdel(src) return - //world << "proccess: [src.left] left" if(left > 0) left-- From f89edb8e801141509bdf5f6863c387eefe59defe Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 18:15:59 +1030 Subject: [PATCH 18/32] Fixes drop pods activating each other's doors. --- code/modules/random_map/drop/droppod_doors.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index a5e3377f99a..eb5b7c3e17f 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -39,7 +39,7 @@ playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) // This is shit but it will do for the sake of testing. - for(var/obj/structure/droppod_door/D in range(5,src)) + for(var/obj/structure/droppod_door/D in orange(1,src)) if(D.deployed) continue D.deploy() From 63c4da0f9f53ab26b3081c6080155790b36dc6a2 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 18:17:26 +1030 Subject: [PATCH 19/32] Fixes reset decals not destroying themselves. --- code/game/turfs/flooring/flooring_decals.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 7989442c902..484491e7d68 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -39,6 +39,7 @@ var/list/floor_decals = list() if(T.decals && T.decals.len) T.decals.Cut() T.update_icon() + qdel(src) return /obj/effect/floor_decal/corner From d4bf0ecb26bba79a624e23ca64fe4b0d7b9ef64b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 18:19:02 +1030 Subject: [PATCH 20/32] Adds a /prebuilt floor light for use by mappers. --- code/game/machinery/floor_light.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 9267f1edbeb..7298b62abf9 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -19,6 +19,9 @@ var/list/floor_light_cache = list() var/default_light_power = 2 var/default_light_colour = "#FFFFFF" +/obj/machinery/floor_light/prebuilt + anchored = 1 + /obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/weapon/screwdriver)) anchored = !anchored From 7ff77f507993d9871d628496684df8d6343a18f4 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 18:21:09 +1030 Subject: [PATCH 21/32] Removes a leftover world << --- code/modules/organs/robolimbs.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 52e2bd97dd4..e046422b1bf 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -7,7 +7,6 @@ var/global/datum/robolimb/basic_robolimb for(var/limb_type in typesof(/datum/robolimb)) var/datum/robolimb/R = new limb_type() all_robolimbs[R.company] = R - world << "Adding [R.company] as [R], [R.type]" if(!R.unavailable_at_chargen) chargen_robolimbs[R.company] = R From f63a03363b5f939445d80fb023ac78823bf715e6 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 19:26:54 +1030 Subject: [PATCH 22/32] Fix for a merge error resulting in very wonky hardsuit behavior. --- code/modules/clothing/spacesuits/rig/rig.dm | 21 ++++++++----------- .../clothing/spacesuits/rig/rig_attackby.dm | 6 +++--- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 13d48df5cce..d469746af65 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -307,7 +307,7 @@ if(piece.loc != src && !(wearer && piece.loc == wearer)) if(istype(piece.loc, /mob/living)) M = piece.loc - M.drop_from_inventory(piece) + M.unEquip(piece) piece.forceMove(src) if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0) @@ -561,7 +561,7 @@ if(!do_after(M,seal_delay)) if(M && M.back == src) M.back = null - M.drop_from_inventory(src) + M.unEquip(src) src.forceMove(get_turf(src)) return @@ -618,7 +618,7 @@ if(use_obj && check_slot == use_obj) H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly." use_obj.canremove = 1 - holder.drop_from_inventory(use_obj) + holder.unEquip(use_obj) use_obj.forceMove(get_turf(src)) use_obj.dropped() use_obj.canremove = 0 @@ -632,12 +632,9 @@ use_obj.forceMove(src) if(check_slot) H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." + return else - use_obj.forceMove(H) - if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0)) - use_obj.forceMove(src) - else - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." + H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." if(piece == "helmet" && helmet) helmet.update_light(H) @@ -654,25 +651,25 @@ if(sealed) if(H.head) var/obj/item/garbage = H.head - H.drop_from_inventory(garbage) + H.unEquip(garbage) H.head = null qdel(garbage) if(H.gloves) var/obj/item/garbage = H.gloves - H.drop_from_inventory(garbage) + H.unEquip(garbage) H.gloves = null qdel(garbage) if(H.shoes) var/obj/item/garbage = H.shoes - H.drop_from_inventory(garbage) + H.unEquip(garbage) H.shoes = null qdel(garbage) if(H.wear_suit) var/obj/item/garbage = H.wear_suit - H.drop_from_inventory(garbage) + H.unEquip(garbage) H.wear_suit = null qdel(garbage) diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 8faff35a296..3aaddcd9b59 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -56,7 +56,7 @@ user << "\The [src] already has a tank installed." return - user.drop_from_inventory(W) + user.unEquip(W) air_supply = W W.forceMove(src) user << "You slot [W] into [src] and tighten the connecting valve." @@ -85,7 +85,7 @@ if(!user || !W) return user << "You install \the [mod] into \the [src]." - user.drop_from_inventory(mod) + user.unEquip(mod) installed_modules |= mod mod.forceMove(src) mod.installed(src) @@ -95,7 +95,7 @@ else if(!cell && istype(W,/obj/item/weapon/cell)) user << "You jack \the [W] into \the [src]'s battery mount." - user.drop_from_inventory(W) + user.unEquip(W) W.forceMove(src) src.cell = W return From bf186a4a01efcd9e37c2f76ae871ed777cd63ec4 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 19:36:45 +1030 Subject: [PATCH 23/32] Adds a confirmation to user-activated ninja self destruct. --- .../clothing/spacesuits/rig/modules/ninja.dm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index b8244a0a8a2..9c516009525 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -169,6 +169,10 @@ interface_name = "dead man's switch" interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button." + var/list/explosion_values = list(1,2,4,5) + +/obj/item/rig_module/self_destruct/small + explosion_values = list(0,0,3,4) /obj/item/rig_module/self_destruct/activate() return @@ -184,17 +188,12 @@ //OH SHIT. if(holder.wearer.stat == 2) - engage() + engage(1) -/obj/item/rig_module/self_destruct/engage() - explosion(get_turf(src), 1, 2, 4, 5) - if(holder && holder.wearer) - holder.wearer.drop_from_inventory(src) - qdel(holder) - qdel(src) - -/obj/item/rig_module/self_destruct/small/engage() - explosion(get_turf(src), 0, 0, 3, 4) +/obj/item/rig_module/self_destruct/engage(var/skip_check) + if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No") + return + explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4]) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) qdel(holder) From 8902d259750f3e172956b2ff5bc744c6e02a31dd Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 19:50:43 +1030 Subject: [PATCH 24/32] Nullchecks/delays for a station console monitor runtime. Hackfix, should be reviewed. --- code/game/machinery/computer/atmos_alert.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index f4b06aff1c1..04c4ecc5013 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -12,12 +12,12 @@ var/global/list/minor_air_alarms = list() icon_screen = "alert:0" light_color = "#e6ffff" -/obj/machinery/computer/atmos_alert/New() +/obj/machinery/computer/atmos_alert/initialize() ..() - atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) + if(atmosphere_alarm) atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/atmos_alert/Destroy() - atmosphere_alarm.unregister(src) + if(atmosphere_alarm) atmosphere_alarm.unregister(src) ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) From 4535ab99a56cab00fc9bdac8cc31722ad31229ef Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 19:51:48 +1030 Subject: [PATCH 25/32] Rig unEquip() amendments. --- code/modules/clothing/spacesuits/rig/rig.dm | 14 +++++++------- .../clothing/spacesuits/rig/rig_attackby.dm | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index d469746af65..426b133fff1 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -560,8 +560,8 @@ M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...") if(!do_after(M,seal_delay)) if(M && M.back == src) - M.back = null - M.unEquip(src) + if(!M.unEquip(src)) + return src.forceMove(get_turf(src)) return @@ -618,7 +618,7 @@ if(use_obj && check_slot == use_obj) H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly." use_obj.canremove = 1 - holder.unEquip(use_obj) + holder.drop_from_inventory(use_obj) use_obj.forceMove(get_turf(src)) use_obj.dropped() use_obj.canremove = 0 @@ -651,25 +651,25 @@ if(sealed) if(H.head) var/obj/item/garbage = H.head - H.unEquip(garbage) + H.drop_from_inventory(garbage) H.head = null qdel(garbage) if(H.gloves) var/obj/item/garbage = H.gloves - H.unEquip(garbage) + H.drop_from_inventory(garbage) H.gloves = null qdel(garbage) if(H.shoes) var/obj/item/garbage = H.shoes - H.unEquip(garbage) + H.drop_from_inventory(garbage) H.shoes = null qdel(garbage) if(H.wear_suit) var/obj/item/garbage = H.wear_suit - H.unEquip(garbage) + H.drop_from_inventory(garbage) H.wear_suit = null qdel(garbage) diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 3aaddcd9b59..c9526f16261 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -56,7 +56,7 @@ user << "\The [src] already has a tank installed." return - user.unEquip(W) + if(!user.unEquip(W)) return air_supply = W W.forceMove(src) user << "You slot [W] into [src] and tighten the connecting valve." @@ -84,8 +84,8 @@ return if(!user || !W) return + if(!user.unEquip(mod)) return user << "You install \the [mod] into \the [src]." - user.unEquip(mod) installed_modules |= mod mod.forceMove(src) mod.installed(src) @@ -94,8 +94,8 @@ else if(!cell && istype(W,/obj/item/weapon/cell)) + if(!user.unEquip(W)) return user << "You jack \the [W] into \the [src]'s battery mount." - user.unEquip(W) W.forceMove(src) src.cell = W return From 9dfe54d514cd1f8c3d2e08afc2f20712917e0ed3 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 20:28:18 +1030 Subject: [PATCH 26/32] Added a click delay to interactions with the fire axe cabinet. --- .../objects/structures/crates_lockers/closets/fireaxe.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index e93721c53f2..13a567ca758 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -21,7 +21,12 @@ attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri //..() //That's very useful, Erro - var/hasaxe = 0 //gonna come in handy later~ + // This could stand to be put further in, made better, etc. but fuck you. Fuck whoever + // wrote this code. Fuck everything about this object. I hope you step on a Lego. + user.setClickCooldown(10) + // Seriously why the fuck is this even a closet aghasjdhasd I hate you + + var/hasaxe = 0 //gonna come in handy later~ // FUCK YOUR TILDES. if(fireaxe) hasaxe = 1 From 003819cd89f0bea37dcaef57c50dc8b0db556d3a Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 2 Dec 2015 11:05:41 +0100 Subject: [PATCH 27/32] Syndicate id cards now listen for owner destruction. This instead of keeping a list that every mob loops over when they are destroyed, to ensure the reference is removed. --- .../items/weapons/cards_ids_syndicate.dm | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index f86489c1000..eed5692029a 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -1,30 +1,19 @@ -var/global/list/syndicate_ids = list() - /obj/item/weapon/card/id/syndicate name = "agent card" icon_state = "syndicate" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) var/electronic_warfare = 1 - var/registered_user = null + var/mob/registered_user = null /obj/item/weapon/card/id/syndicate/New(mob/user as mob) - syndicate_ids += src ..() access = syndicate_access.Copy() /obj/item/weapon/card/id/syndicate/Destroy() - syndicate_ids -= src registered_user = null return ..() -// On mob destruction, ensure any references are cleared -/mob/Destroy() - for(var/obj/item/weapon/card/id/syndicate/SID in syndicate_ids) - if(SID.registered_user == src) - SID.registered_user = null - return ..() - /obj/item/weapon/card/id/syndicate/prevent_tracking() return electronic_warfare @@ -37,9 +26,8 @@ var/global/list/syndicate_ids = list() user << "The microscanner activates as you pass it over the ID, copying its access." /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) - if(!registered_user) - registered_user = user - user.set_id_info(src) + // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked. + if(!registered_user && !registered_name && register_user(user)) user << "The microscanner marks you as its owner, preventing others from accessing its internals." if(registered_user == user) switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) @@ -72,6 +60,21 @@ var/global/list/syndicate_ids = list() ui.set_initial_data(data) ui.open() +/obj/item/weapon/card/id/syndicate/proc/register_user(var/mob/user) + if(!istype(user) || user == registered_user) + return FALSE + unset_registered_user() + registered_user = user + user.set_id_info(src) + user.register(OBSERVER_EVENT_DESTROY, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user) + return TRUE + +/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user) + if(!registered_user || (user && user != registered_user)) + return + registered_user.unregister(OBSERVER_EVENT_DESTROY, src) + registered_user = null + /obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user) if(user != registered_user) return STATUS_CLOSE @@ -172,7 +175,7 @@ var/global/list/syndicate_ids = list() icon_state = initial(icon_state) name = initial(name) registered_name = initial(registered_name) - registered_user = null + unset_registered_user() sex = initial(sex) user << "All information has been deleted from \the [src]." . = 1 From a6517e86b1b26c7a8b02a651ebef280998739f13 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 2 Dec 2015 21:16:06 +1030 Subject: [PATCH 28/32] Total rewrite of awful fireaxe cabinets. --- baystation12.dme | 2 +- .../crates_lockers/closets/fireaxe.dm | 215 ------------------ .../objects/structures/fireaxe_cabinet.dm | 135 +++++++++++ html/changelogs/Zuhayr-fireaxes.yml | 4 + icons/obj/closet.dmi | Bin 82628 -> 73732 bytes icons/obj/structures.dmi | Bin 87943 -> 89517 bytes maps/exodus-1.dmm | 8 +- 7 files changed, 144 insertions(+), 220 deletions(-) delete mode 100644 code/game/objects/structures/crates_lockers/closets/fireaxe.dm create mode 100644 code/game/objects/structures/fireaxe_cabinet.dm create mode 100644 html/changelogs/Zuhayr-fireaxes.yml diff --git a/baystation12.dme b/baystation12.dme index ca75948dfff..6bf05b97b90 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -759,6 +759,7 @@ #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -791,7 +792,6 @@ #include "code\game\objects\structures\crates_lockers\largecrate.dm" #include "code\game\objects\structures\crates_lockers\closets\coffin.dm" #include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" #include "code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm deleted file mode 100644 index 13a567ca758..00000000000 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ /dev/null @@ -1,215 +0,0 @@ -//I still dont think this should be a closet but whatever -/obj/structure/closet/fireaxecabinet - name = "fire axe cabinet" - desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/weapon/material/twohanded/fireaxe/fireaxe - icon_state = "fireaxe1000" - icon_closed = "fireaxe1000" - icon_opened = "fireaxe1100" - anchored = 1 - density = 0 - var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri - opened = 1 - var/hitstaken = 0 - var/locked = 1 - var/smashed = 0 - - New() - ..() - fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src) - - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - //..() //That's very useful, Erro - - // This could stand to be put further in, made better, etc. but fuck you. Fuck whoever - // wrote this code. Fuck everything about this object. I hope you step on a Lego. - user.setClickCooldown(10) - // Seriously why the fuck is this even a closet aghasjdhasd I hate you - - var/hasaxe = 0 //gonna come in handy later~ // FUCK YOUR TILDES. - if(fireaxe) - hasaxe = 1 - - if (isrobot(usr) || src.locked) - if(istype(O, /obj/item/device/multitool)) - user << "Resetting circuitry..." - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) - if(do_after(user, 20)) - src.locked = 0 - user << " You disable the locking modules." - update_icon() - return - else if(istype(O, /obj/item/weapon)) - var/obj/item/weapon/W = O - if(src.smashed || src.localopened) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time - if(W.force < 15) - user << "The cabinet's protective glass glances off the hit." - else - src.hitstaken++ - if(src.hitstaken == 4) - playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. - src.smashed = 1 - src.locked = 0 - src.localopened = 1 - update_icon() - return - if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened) - if(!fireaxe) - if(O:wielded) - user << "Unwield the axe first." - return - fireaxe = O - user.remove_from_mob(O) - src.contents += O - user << "You place the fire axe back in the [src.name]." - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - if(src.smashed) - return - if(istype(O, /obj/item/device/multitool)) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - user << "Resetting circuitry..." - sleep(50) - src.locked = 1 - user << "You re-enable the locking modules." - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) - if(do_after(user,20)) - src.locked = 1 - user << " You re-enable the locking modules." - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - - - - attack_hand(mob/user as mob) - - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - - if(src.locked) - user <<"The cabinet won't budge!" - return - if(localopened) - if(fireaxe) - user.put_in_hands(fireaxe) - fireaxe = null - user << "You take the fire axe from the [name]." - src.add_fingerprint(user) - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - else - localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - attack_tk(mob/user as mob) - if(localopened && fireaxe) - fireaxe.forceMove(loc) - user << "You telekinetically remove the fire axe." - fireaxe = null - update_icon() - return - attack_hand(user) - - verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri - set name = "Open/Close" - set category = "Object" - - if (isrobot(usr) || src.locked || src.smashed) - if(src.locked) - usr << "The cabinet won't budge!" - else if(src.smashed) - usr << "The protective glass is broken!" - return - - localopened = !localopened - update_icon() - - verb/remove_fire_axe() - set name = "Remove Fire Axe" - set category = "Object" - - if (isrobot(usr)) - return - - if (localopened) - if(fireaxe) - usr.put_in_hands(fireaxe) - fireaxe = null - usr << "You take the Fire axe from the [name]." - else - usr << "The [src.name] is empty." - else - usr << "The [src.name] is closed." - update_icon() - - attack_ai(mob/user as mob) - if(src.smashed) - user << "The security of the cabinet is compromised." - return - else - locked = !locked - if(locked) - user << "Cabinet locked." - else - user << "Cabinet unlocked." - return - - update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed) - - open() - return - - close() - return diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm new file mode 100644 index 00000000000..a19693f5ab9 --- /dev/null +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -0,0 +1,135 @@ +/obj/structure/fireaxecabinet + name = "fire axe cabinet" + desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." + icon_state = "fireaxe" + anchored = 1 + density = 0 + + var/damage_threshold = 15 + var/open + var/unlocked + var/shattered + var/obj/item/weapon/material/twohanded/fireaxe/fireaxe + +/obj/structure/fireaxecabinet/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker) + user.do_attack_animation(src) + playsound(user, 'sound/effects/Glasshit.ogg', 50, 1) + visible_message("[user] [attack_verb] \the [src]!") + if(damage_threshold > damage) + user << "Your strike is deflected by the reinforced glass!" + return + if(shattered) + return + shattered = 1 + unlocked = 1 + open = 1 + playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) + update_icon() + +/obj/structure/fireaxecabinet/update_icon() + overlays.Cut() + if(fireaxe) + overlays += image(icon, "fireaxe_item") + if(shattered) + overlays += image(icon, "fireaxe_window_broken") + else if(!open) + overlays += image(icon, "fireaxe_window") + +/obj/structure/fireaxecabinet/New() + ..() + fireaxe = new(src) + update_icon() + +/obj/structure/fireaxecabinet/attack_ai(var/mob/user) + toggle_lock(user) + +/obj/structure/fireaxecabinet/attack_hand(var/mob/user) + if(!unlocked) + user << "\The [src] is locked." + return + toggle_open(user) + +/obj/structure/fireaxecabinet/MouseDrop(over_object, src_location, over_location) + if(over_object == usr) + var/mob/user = over_object + if(!istype(user)) + return + + if(!open) + user << "\The [src] is closed." + return + + if(!fireaxe) + user << "\The [src] is empty." + return + + fireaxe.forceMove(get_turf(user)) + user.put_in_hands(fireaxe) + fireaxe = null + update_icon() + + return + +/obj/structure/fireaxecabinet/Destroy() + if(fireaxe) + fireaxe.forceMove(get_turf(src)) + fireaxe = null + return ..() + +/obj/structure/fireaxecabinet/attackby(var/obj/item/O, var/mob/user) + + if(istype(O, /obj/item/device/multitool)) + toggle_lock(user) + return + + if(istype(O, /obj/item/weapon/material/twohanded/fireaxe)) + if(open) + if(fireaxe) + user << "There is already \a [fireaxe] inside \the [src]." + else if(user.unEquip(O)) + O.forceMove(src) + fireaxe = O + user << "You place \the [fireaxe] into \the [src]." + update_icon() + return + + if(O.force) + user.setClickCooldown(10) + attack_generic(user, O.force, "bashes") + return + + return ..() + +/obj/structure/fireaxecabinet/proc/toggle_open(var/mob/user) + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + open = !open + user << "You [open ? "open" : "close"] \the [src]." + update_icon() + +/obj/structure/fireaxecabinet/proc/toggle_lock(var/mob/user) + + + if(open) + return + + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + user << "You begin [unlocked ? "enabling" : "disabling"] \the [src]'s maglock." + + if(!do_after(user, 20)) + return + + if(shattered) return + + unlocked = !unlocked + playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + user << "You [unlocked ? "disable" : "enable"] the maglock." + + update_icon() diff --git a/html/changelogs/Zuhayr-fireaxes.yml b/html/changelogs/Zuhayr-fireaxes.yml new file mode 100644 index 00000000000..3bb84e570e0 --- /dev/null +++ b/html/changelogs/Zuhayr-fireaxes.yml @@ -0,0 +1,4 @@ +author: Zuhayr +delete-after: True +changes: + - tweak: "Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click with a hand to open or close, smash with anything that does damage, and drag onto your icon to remove the fireaxe." diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index e42f9d97ab9aa5571f331f4da470dc2611e34710..68fc22f81d1e777f9ad25cae6377a8426216f653 100644 GIT binary patch literal 73732 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”>EXs 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⪼mo}EK7lsLj>a9 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