diff --git a/code/ZAS/ConnectionManager.dm b/code/ZAS/ConnectionManager.dm index 28ef365830..3890cd85f5 100644 --- a/code/ZAS/ConnectionManager.dm +++ b/code/ZAS/ConnectionManager.dm @@ -24,12 +24,16 @@ Class Procs: erase_all() Called when the turf is changed with ChangeTurf(). Erases all existing connections. +Macros: check(connection/c) Checks for connection validity. It's possible to have a reference to a connection that has been erased. */ +// macro-ized to cut down on proc calls +#define check(c) (c && c.valid()) + /turf/var/tmp/connection_manager/connections /connection_manager/var/connection/N @@ -98,5 +102,4 @@ Class Procs: if(check(D)) D.erase() #endif -/connection_manager/proc/check(connection/c) - return c && c.valid() \ No newline at end of file +#undef check diff --git a/code/__defines/map.dm b/code/__defines/map.dm new file mode 100644 index 0000000000..9419415e1c --- /dev/null +++ b/code/__defines/map.dm @@ -0,0 +1,8 @@ +// Z-level flags bitfield - Set these flags to determine the z level's purpose +#define MAP_LEVEL_STATION 0x001 // Z-levels the station exists on +#define MAP_LEVEL_ADMIN 0x002 // Z-levels for admin functionality (Centcom, shuttle transit, etc) +#define MAP_LEVEL_CONTACT 0x004 // Z-levels that can be contacted from the station, for eg announcements +#define MAP_LEVEL_PLAYER 0x008 // Z-levels a character can typically reach +#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge +#define MAP_LEVEL_EMPTY 0x020 // Empty Z-levels that may be used for various things (currently used by bluespace jump) +#define MAP_LEVEL_CONSOLES 0x040 // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset. diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index f1dbc75192..efe5791b11 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -139,45 +139,38 @@ /////// 5.56mm /datum/category_item/autolathe/arms/rifle_556 - name = "10rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556 + name = "rifle magazine (5.56mm)" + path =/obj/item/ammo_magazine/c556 hidden = 1 /datum/category_item/autolathe/arms/rifle_556p - name = "10rnd rifle magazine (5.56mm practice)" - path =/obj/item/ammo_magazine/a556/practice + name = "rifle magazine (5.56mm practice)" + path =/obj/item/ammo_magazine/c556/practice -/datum/category_item/autolathe/arms/rifle_556m - name = "20rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556m +/datum/category_item/autolathe/arms/machinegun_556 + name = "machinegun box magazine (5.56)" + path =/obj/item/ammo_magazine/a556 hidden = 1 - -/datum/category_item/autolathe/arms/rifle_556mp - name = "20rnd rifle magazine (5.56mm practice)" - path =/obj/item/ammo_magazine/a556m/practice - hidden = 1 - /////// 7.62 -/datum/category_item/autolathe/arms/rifle_small_762 - name = "10rnd rifle magazine (7.62mm)" - path =/obj/item/ammo_magazine/s762 - hidden = 1 + /datum/category_item/autolathe/arms/rifle_762 - name = "20rnd rifle magazine (7.62mm)" + name = "rifle magazine (7.62mm)" path =/obj/item/ammo_magazine/c762 hidden = 1 -/datum/category_item/autolathe/arms/machinegun_762 - name = "machinegun box magazine (7.62)" - path =/obj/item/ammo_magazine/a762 - hidden = 1 - /datum/category_item/autolathe/arms/shotgun_magazine name = "24rnd shotgun magazine (12g)" path =/obj/item/ammo_magazine/g12 hidden = 1 +/* +/datum/category_item/autolathe/arms/rifle_small_762 + name = "rifle magazine (7.62mm)" + path =/obj/item/ammo_magazine/s762 + hidden = 1 +*/ + /* Commented out until autolathe stuff is decided/fixed. Will probably remove these entirely. -Spades // These should always be/empty! The idea is to fill them up manually with ammo clips. @@ -351,7 +344,7 @@ path =/obj/item/ammo_magazine/clip/a50 category = "Arms and Ammunition" hidden = 1 - +*/ /datum/category_item/autolathe/arms/rifle_clip_556 name = "ammo clip (5.56mm)" path =/obj/item/ammo_magazine/clip/a556 @@ -362,7 +355,6 @@ name = "ammo clip (5.56mm practice)" path =/obj/item/ammo_magazine/clip/a556/practice category = "Arms and Ammunition" -*/ /datum/category_item/autolathe/arms/rifle_clip_762 name = "ammo clip (7.62mm)" diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm index 2611ad18d3..4aefe349fd 100644 --- a/code/datums/uplink/ammunition.dm +++ b/code/datums/uplink/ammunition.dm @@ -48,42 +48,41 @@ name = "Anti-Materiel Rifle ammo box (14.5mm)" path = /obj/item/weapon/storage/box/sniperammo -/datum/uplink_item/item/ammo/a556 - name = "10rnd Rifle Magazine (5.56mm)" - path = /obj/item/ammo_magazine/a556 +/datum/uplink_item/item/ammo/c556 + name = "Rifle Magazine (5.56mm)" + path = /obj/item/ammo_magazine/c556 -/datum/uplink_item/item/ammo/a556/ap - name = "10rnd Rifle Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/a556/ap +/datum/uplink_item/item/ammo/c556/ext + name = "Rifle Magazine (5.56mm Extended)" + path = /obj/item/ammo_magazine/c556/ext + +/datum/uplink_item/item/ammo/c556/ap + name = "Rifle Magazine (5.56mm AP)" + path = /obj/item/ammo_magazine/c556/ap + +/datum/uplink_item/item/ammo/c556/ap/ext + name = "Rifle Magazine (5.56mm AP Extended)" + path = /obj/item/ammo_magazine/c556/ap/ext /datum/uplink_item/item/ammo/c762 - name = "20rnd Rifle Magazine (7.62mm)" + name = "Rifle Magazine (7.62mm)" path = /obj/item/ammo_magazine/c762 /datum/uplink_item/item/ammo/c762/ap - name = "20rnd Rifle Magazine (7.62mm AP)" + name = "Rifle Magazine (7.62mm AP)" path = /obj/item/ammo_magazine/c762/ap -/datum/uplink_item/item/ammo/s762 - name = "10rnd Rifle Magazine (7.62mm)" - path = /obj/item/ammo_magazine/s762 - item_cost = 10 // Half the capacity. - -/datum/uplink_item/item/ammo/s762/ap - name = "10rnd Rifle Magazine (7.62mm AP)" - path = /obj/item/ammo_magazine/s762/ap - /datum/uplink_item/item/ammo/a10mm name = "SMG Magazine (10mm)" path = /obj/item/ammo_magazine/a10mm -/datum/uplink_item/item/ammo/a762 - name = "Machinegun Magazine (7.62mm)" - path = /obj/item/ammo_magazine/a762 +/datum/uplink_item/item/ammo/a556 + name = "Machinegun Magazine (5.56mm)" + path = /obj/item/ammo_magazine/a556 -/datum/uplink_item/item/ammo/a762/ap - name = "Machinegun Magazine (7.62mm AP)" - path = /obj/item/ammo_magazine/a762/ap +/datum/uplink_item/item/ammo/a556/ap + name = "Machinegun Magazine (5.56mm AP)" + path = /obj/item/ammo_magazine/a556/ap /datum/uplink_item/item/ammo/g12 name = "12g Shotgun Ammo Box (Slug)" diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index 6bbc1d0606..4c96f5ce17 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -9,6 +9,8 @@ var/datum/antagonist/traitor/traitors /datum/antagonist/traitor/auto id = MODE_AUTOTRAITOR allow_latejoin = 1 + hard_cap = 4 + initial_spawn_target = 4 /datum/antagonist/traitor/New() ..() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f6a965dcf7..db79ad8d51 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -281,9 +281,11 @@ var/list/mob/living/forced_ambiance_list = new if(istype(mob,/mob/living/carbon/human/)) var/mob/living/carbon/human/H = mob + if(H.buckled) + return // Being buckled to something solid keeps you in place. if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP)) return - + if(H.m_intent == "run") H.AdjustStunned(6) H.AdjustWeakened(6) diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm index d5d28bc118..8b060429e8 100644 --- a/code/game/gamemodes/technomancer/assistance/assistance.dm +++ b/code/game/gamemodes/technomancer/assistance/assistance.dm @@ -98,8 +98,8 @@ /datum/technomancer/assistance/golem name = "Friendly GOLEM unit" desc = "Teleports a specially designed synthetic unit to you, which is very durable, has an advanced AI, and can also use \ - functions. It knows Shield, Targeted Blink, Beam, Flame Tongue, Mend Wounds, and Mend Burns. It also has a large storage \ - capacity for energy, and due to it's synthetic nature, instability is less of an issue for them." + functions. It knows Shield, Targeted Blink, Beam, Mend Life, Mend Synthetic, Lightning, Repel Missiles, Corona, Ionic Bolt, Dispel, and Chain Lightning. \ + It also has a large storage capacity for energy, and due to it's synthetic nature, instability is less of an issue for them." cost = 350 obj_path = null //TODO one_use_only = 1 diff --git a/code/game/gamemodes/technomancer/assistance/golem.dm b/code/game/gamemodes/technomancer/assistance/golem.dm index 8bb6ef2ea0..e0a0a5fd71 100644 --- a/code/game/gamemodes/technomancer/assistance/golem.dm +++ b/code/game/gamemodes/technomancer/assistance/golem.dm @@ -1,9 +1,9 @@ //An AI-controlled 'companion' for the Technomancer. It's tough, strong, and can also use spells. -/mob/living/simple_animal/hostile/technomancer_golem +/mob/living/simple_animal/technomancer_golem name = "G.O.L.E.M." desc = "A rather unusual looking synthetic." - icon = 'icons/mob/robots.dmi' - icon_state = "Security" + icon = 'icons/mob/mob.dmi' + icon_state = "technomancer_golem" health = 250 maxHealth = 250 stop_automated_movement = 1 @@ -27,46 +27,137 @@ unsuitable_atoms_damage = 0 speed = 0 - melee_damage_lower = 10 - melee_damage_upper = 10 - attacktext = "pummeled" + melee_damage_lower = 30 // It has a built in esword. + melee_damage_upper = 30 + attacktext = "slashed" attack_sound = null friendly = "hugs" resistance = 0 - var/obj/item/weapon/technomancer_core/core = null - var/obj/item/weapon/spell/active_spell = null + var/obj/item/weapon/technomancer_core/golem/core = null + var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells var/mob/living/master = null -/mob/living/simple_animal/hostile/technomancer_golem/New() - ..() - core = new core(src) + var/list/known_spells = list( + "reflect" = /obj/item/weapon/spell/reflect, + "shield" = /obj/item/weapon/spell/shield, + "dispel" = /obj/item/weapon/spell/dispel, + "mend life" = /obj/item/weapon/spell/modifier/mend_life, + "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic, + "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles, + "corona" = /obj/item/weapon/spell/modifier/corona, + "beam" = /obj/item/weapon/spell/projectile/beam, + "chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning, + "force missile" = /obj/item/weapon/spell/projectile/force_missile, + "ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt, + "lightning" = /obj/item/weapon/spell/projectile/lightning + ) -/mob/living/simple_animal/hostile/technomancer_golem/Destroy() +/mob/living/simple_animal/technomancer_golem/New() + ..() + core = new(src) + update_icon() + +/mob/living/simple_animal/technomancer_golem/Destroy() qdel(core) ..() -/mob/living/simple_animal/hostile/technomancer_golem/proc/bind_to_mob(mob/user) +/mob/living/simple_animal/technomancer_golem/update_icon() + overlays.Cut() + overlays.Add(image(icon, src, "golem_sword")) + overlays.Add(image(icon, src, "golem_spell")) + +/mob/living/simple_animal/technomancer_golem/isSynthetic() + return TRUE // So Mend Synthetic will work on them. + +/mob/living/simple_animal/technomancer_golem/place_spell_in_hand(var/path) + if(!path || !ispath(path)) + return 0 + + if(active_spell) + qdel(active_spell) // Get rid of our old spell. + + var/obj/item/weapon/spell/S = new path(src) + active_spell = S + +/mob/living/simple_animal/technomancer_golem/verb/test_giving_spells() + var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells + if(choice) + place_spell_in_hand(known_spells[choice]) + +// Used to cast spells. +/mob/living/simple_animal/technomancer_golem/RangedAttack(var/atom/A, var/params) + if(active_spell) + if(active_spell.cast_methods & CAST_RANGED) + active_spell.on_ranged_cast(A, src) + +/mob/living/simple_animal/technomancer_golem/UnarmedAttack(var/atom/A, var/proximity) + if(proximity) + if(active_spell) + if(active_spell.cast_methods & CAST_MELEE) + active_spell.on_melee_cast(A, src) + else if(active_spell.cast_methods & CAST_RANGED) + active_spell.on_ranged_cast(A, src) + var/effective_cooldown = round(active_spell.cooldown * core.cooldown_modifier, 5) + src.setClickCooldown(effective_cooldown) + else + ..() + +/mob/living/simple_animal/technomancer_golem/get_technomancer_core() + return core + +/mob/living/simple_animal/technomancer_golem/proc/bind_to_mob(mob/user) if(!user || master) return master = user name = "[master]'s [initial(name)]" -/mob/living/simple_animal/hostile/technomancer_golem/examine(mob/user) +/mob/living/simple_animal/technomancer_golem/examine(mob/user) ..() if(user.mind && technomancers.is_antagonist(user.mind)) user << "Your pride and joy. It's a very special synthetic robot, capable of using functions similar to you, and you built it \ yourself! It'll always stand by your side, ready to help you out. You have no idea what GOLEM stands for, however..." -/mob/living/simple_animal/hostile/technomancer_golem/Life() +/mob/living/simple_animal/technomancer_golem/Life() + ..() handle_ai() -/mob/living/simple_animal/hostile/technomancer_golem/proc/handle_ai() +// This is where the real spaghetti begins. +/mob/living/simple_animal/technomancer_golem/proc/handle_ai() if(!master) return if(get_dist(src, master) > 6 || src.z != master.z) - recall_to_master() + targeted_blink(master) + + // Give our allies buffs and heals. + for(var/mob/living/L in view(src)) + if(L in friends) + support_friend(L) + return + +/mob/living/simple_animal/technomancer_golem/proc/support_friend(var/mob/living/L) + if(L.getBruteLoss() >= 10 || L.getFireLoss() >= 10) + if(L.isSynthetic() && !L.has_modifier_of_type(/datum/modifier/technomancer/mend_synthetic)) + place_spell_in_hand(known_spells["mend synthetic"]) + targeted_blink(L) + UnarmedAttack(L, 1) + else if(!L.has_modifier_of_type(/datum/modifier/technomancer/mend_life)) + place_spell_in_hand(known_spells["mend life"]) + targeted_blink(L) + UnarmedAttack(L, 1) + return -/mob/living/simple_animal/hostile/technomancer_golem/proc/recall_to_master() + // Give them repel missiles if they lack it. + if(!L.has_modifier_of_type(/datum/modifier/technomancer/repel_missiles)) + place_spell_in_hand(known_spells["repel missiles"]) + RangedAttack(L) + return + +/mob/living/simple_animal/technomancer_golem/proc/targeted_blink(var/atom/target) + var/datum/effect/effect/system/spark_spread/spark_system = new() + spark_system.set_up(5, 0, get_turf(src)) + spark_system.start() + src.visible_message("\The [src] vanishes!") + src.forceMove(get_turf(target)) return \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index 079db9a90b..7cea66660e 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -330,6 +330,18 @@ spell_power_modifier = 1.75 energy_cost_modifier = 2.0 +// For use only for the GOLEM. +/obj/item/weapon/technomancer_core/golem + name = "integrated core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is not meant \ + to be worn on the back like other cores. Instead it is meant to be installed inside a synthetic shell. As a result, it's \ + a lot more robust." + energy = 25000 + max_energy = 25000 + regen_rate = 100 //250 seconds to full + instability_modifier = 0.75 + + /obj/item/weapon/technomancer_core/verb/toggle_lock() set name = "Toggle Core Lock" set category = "Object" diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index 6b981aa8eb..2e9a60a8e6 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -1,8 +1,8 @@ /datum/technomancer/equipment/tesla_armor name = "Tesla Armor" desc = "This piece of armor offers a retaliation-based defense. When the armor is 'ready', it will completely protect you from \ - the next attack you suffer, and strike the attacker with a strong bolt of lightning. This effect requires twenty seconds to \ - recharge. If you are attacked while this is recharging, a weaker lightning bolt is sent out, however you won't be protected from \ + the next attack you suffer, and strike the attacker with a strong bolt of lightning, provided they are close enough. This effect requires \ + fifteen seconds to recharge. If you are attacked while this is recharging, a weaker lightning bolt is sent out, however you won't be protected from \ the person beating you." cost = 150 obj_path = /obj/item/clothing/suit/armor/tesla @@ -10,23 +10,33 @@ /obj/item/clothing/suit/armor/tesla name = "tesla armor" desc = "This rather dangerous looking armor will hopefully shock your enemies, and not you in the process." - icon_state = "reactiveoff" //wip - item_state = "reactiveoff" + icon_state = "reactive" //wip + item_state = "reactive" blood_overlay_type = "armor" slowdown = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/ready = 1 //Determines if the next attack will be blocked, as well if a strong lightning bolt is sent out at the attacker. var/ready_icon_state = "reactive" //also wip - var/cooldown_to_charge = 20 SECONDS + var/normal_icon_state = "reactiveoff" + var/cooldown_to_charge = 15 SECONDS /obj/item/clothing/suit/armor/tesla/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") //First, some retaliation. - if(attacker && attacker != user) - if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at. + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + if(P.firer && get_dist(user, P.firer) <= 3) if(ready) - shoot_lightning(attacker, 40) + shoot_lightning(P.firer, 40) else - shoot_lightning(attacker, 15) + shoot_lightning(P.firer, 15) + + else + if(attacker && attacker != user) + if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at. + if(ready) + shoot_lightning(attacker, 40) + else + shoot_lightning(attacker, 15) //Deal with protecting our wearer now. if(ready) @@ -45,10 +55,14 @@ if(ready) icon_state = ready_icon_state else - icon_state = initial(icon_state) + icon_state = normal_icon_state + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit(0) /obj/item/clothing/suit/armor/tesla/proc/shoot_lightning(var/mob/target, var/power) var/obj/item/projectile/beam/lightning/lightning = new(src) lightning.power = power lightning.launch(target) - visible_message("\The [src] strikes \the [target] with lightning!") \ No newline at end of file + visible_message("\The [src] strikes \the [target] with lightning!") + playsound(get_turf(src), 'sound/weapons/gauss_shoot.ogg', 75, 1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index be35adec6e..21d746742f 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -44,25 +44,25 @@ // Description: Makes instability decay. instability_effects() handles the bad effects for having instability. It will also hold back // from causing bad effects more than one every ten seconds, to prevent sudden death from angry RNG. /mob/living/proc/handle_instability() - instability = round(Clamp(instability, 0, 200)) + instability = Ceiling(Clamp(instability, 0, 200)) //This should cushon against really bad luck. if(instability && last_instability_event < (world.time - 10 SECONDS) && prob(20)) instability_effects() switch(instability) if(1 to 10) - adjust_instability(-2) + adjust_instability(-1) if(11 to 20) - adjust_instability(-4) + adjust_instability(-2) if(21 to 30) - adjust_instability(-6) + adjust_instability(-3) if(31 to 40) - adjust_instability(-8) + adjust_instability(-4) if(41 to 50) - adjust_instability(-10) + adjust_instability(-5) if(51 to 100) - adjust_instability(-20) + adjust_instability(-10) if(101 to 200) - adjust_instability(-40) + adjust_instability(-20) /mob/living/carbon/human/handle_instability() ..() @@ -277,12 +277,17 @@ // People next to the source take a third of the instability. Further distance decreases the amount absorbed. var/outgoing_instability = (instability / 3) * ( 1 / (radius**2) ) - // Energy armor like from the AMI RIG can protect from this. - var/armor = getarmor(null, "energy") - var/armor_factor = abs( (armor - 100) / 100) - outgoing_instability = outgoing_instability * armor_factor - if(outgoing_instability) - to_chat(H, "The purple glow makes you feel strange...") - H.adjust_instability(outgoing_instability) + + H.receive_radiated_instability(outgoing_instability) set_light(distance, distance * 4, l_color = "#C26DDE") + +// This should only be used for EXTERNAL sources of instability, such as from someone or something glowing. +/mob/living/proc/receive_radiated_instability(amount) + // Energy armor like from the AMI RIG can protect from this. + var/armor = getarmor(null, "energy") + var/armor_factor = abs( (armor - 100) / 100) + amount = amount * armor_factor + if(amount && prob(10)) + to_chat(src, "The purple glow makes you feel strange...") + adjust_instability(amount) diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index faaf3ee75a..2dede11a94 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -31,7 +31,8 @@ ) throwforce = 0 force = 0 - var/mob/living/carbon/human/owner = null +// var/mob/living/carbon/human/owner = null + var/mob/living/owner = null var/obj/item/weapon/technomancer_core/core = null var/cast_methods = null // Controls how the spell is casted. var/aspect = null // Used for combining spells. @@ -115,16 +116,33 @@ amount = round(amount * core.instability_modifier, 0.1) owner.adjust_instability(amount) +// Proc: get_technomancer_core() +// Parameters: 0 +// Description: Returns the technomancer's core, assuming it is being worn properly. +/mob/living/proc/get_technomancer_core() + return null + +/mob/living/carbon/human/get_technomancer_core() + var/obj/item/weapon/technomancer_core/core = back + if(istype(core)) + return core + return null + // Proc: New() // Parameters: 0 // Description: Sets owner to equal its loc, links to the owner's core, then applies overlays if needed. /obj/item/weapon/spell/New() ..() - if(ishuman(loc)) + if(isliving(loc)) owner = loc if(owner) - if(istype(/obj/item/weapon/technomancer_core, owner.back)) - core = owner.back + core = owner.get_technomancer_core() + if(!core) + to_chat(owner, "You need a Core to do that.") + qdel(src) + return +// if(istype(/obj/item/weapon/technomancer_core, owner.back)) +// core = owner.back update_icon() // Proc: Destroy() diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm index 7abf5d6898..48d7cc3165 100644 --- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -13,17 +13,18 @@ /obj/item/weapon/spell/aura/fire name = "Fire Storm" desc = "Things are starting to heat up." - icon_state = "generic" + icon_state = "fire_bolt" aspect = ASPECT_FIRE glow_color = "#FF6A00" /obj/item/weapon/spell/aura/fire/process() if(!pay_energy(100)) qdel(src) - var/list/nearby_things = range(calculate_spell_power(4),owner) + var/list/nearby_things = range(round(calculate_spell_power(4)),owner) - var/temp_change = calculate_spell_power(80) - var/temp_cap = calculate_spell_power(600) + var/temp_change = calculate_spell_power(150) + var/datum/species/baseline = all_species["Human"] + var/temp_cap = baseline.heat_level_3 * 2 var/fire_power = calculate_spell_power(2) if(check_for_scepter()) @@ -38,7 +39,8 @@ var/protection = H.get_heat_protection(1000) if(protection < 1) var/heat_factor = abs(protection - 1) - H.bodytemperature = min( (H.bodytemperature + temp_change) * heat_factor, temp_cap) + temp_change *= heat_factor + H.bodytemperature = min(H.bodytemperature + temp_change, temp_cap) turf_check: for(var/turf/simulated/T in nearby_things) diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm index 20ef497cc3..240265cfa4 100644 --- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -2,7 +2,7 @@ name = "Chilling Aura" desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to become very slow if \ they stay within four meters of you." - enhancement_desc = "The chill becomes lethal." + enhancement_desc = "Will make nearby entities even slower." spell_power_desc = "Radius and rate of cooling are scaled." cost = 100 obj_path = /obj/item/weapon/spell/aura/frost @@ -20,14 +20,16 @@ /obj/item/weapon/spell/aura/frost/process() if(!pay_energy(100)) qdel(src) - var/list/nearby_mobs = range(calculate_spell_power(4),owner) + var/list/nearby_mobs = range(round(calculate_spell_power(4)),owner) var/temp_change = calculate_spell_power(40) - var/temp_cap = 260 // Just above the damage threshold, for humans. Unathi are less fortunate. + var/datum/species/baseline = all_species["Human"] + var/temp_cap = baseline.cold_level_2 - 5 if(check_for_scepter()) temp_change *= 2 - temp_cap = 200 + temp_cap = baseline.cold_level_3 - 5 + for(var/mob/living/carbon/human/H in nearby_mobs) if(is_ally(H)) continue @@ -35,6 +37,7 @@ var/protection = H.get_cold_protection(1000) if(protection < 1) var/cold_factor = abs(protection - 1) - H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap) + temp_change *= cold_factor + H.bodytemperature = max(H.bodytemperature - temp_change, temp_cap) adjust_instability(1) diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm index 10f258bf58..60266426cb 100644 --- a/code/game/gamemodes/technomancer/spells/dispel.dm +++ b/code/game/gamemodes/technomancer/spells/dispel.dm @@ -18,9 +18,6 @@ /obj/item/weapon/spell/dispel/on_ranged_cast(atom/hit_atom, mob/living/user) if(isliving(hit_atom) && within_range(hit_atom) && pay_energy(1000)) var/mob/living/target = hit_atom - for(var/obj/item/weapon/inserted_spell/I in target) - I.on_expire(dispelled = 1) - log_and_message_admins("dispelled [I] on [target].") target.remove_modifiers_of_type(/datum/modifier/technomancer) user.adjust_instability(10) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/gambit.dm b/code/game/gamemodes/technomancer/spells/gambit.dm index 0541e5473e..e0116073dc 100644 --- a/code/game/gamemodes/technomancer/spells/gambit.dm +++ b/code/game/gamemodes/technomancer/spells/gambit.dm @@ -1,6 +1,9 @@ /datum/technomancer/spell/gambit name = "Gambit" desc = "This function causes you to receive a random function, including those which you haven't purchased." +// enhancement_desc = "Makes results less random and more biased towards what the function thinks you need in your current situation." + enhancement_desc = "Instead of a purely random spell, it will give you a \"random\" spell." + spell_power_desc = "Makes certain rare functions possible to acquire via Gambit which cannot be obtained otherwise, if above 100%." ability_icon_state = "tech_gambit" cost = 50 obj_path = /obj/item/weapon/spell/gambit @@ -11,9 +14,10 @@ /obj/item/weapon/spell/gambit, /obj/item/weapon/spell/projectile, /obj/item/weapon/spell/aura, - /obj/item/weapon/spell/insert, +// /obj/item/weapon/spell/insert, /obj/item/weapon/spell/spawner, - /obj/item/weapon/spell/summon) + /obj/item/weapon/spell/summon, + /obj/item/weapon/spell/modifier) /obj/item/weapon/spell/gambit name = "gambit" @@ -21,12 +25,110 @@ icon_state = "gambit" cast_methods = CAST_USE aspect = ASPECT_UNSTABLE + var/list/rare_spells = list( + /obj/item/weapon/spell/modifier/mend_all + ) + /obj/item/weapon/spell/gambit/on_use_cast(mob/living/carbon/human/user) if(pay_energy(200)) adjust_instability(3) - var/obj/item/weapon/spell/random_spell = pick(all_technomancer_gambit_spells) - if(random_spell) - user.drop_from_inventory(src, null) - user.place_spell_in_hand(random_spell) + if(check_for_scepter()) + give_new_spell(biased_random_spell()) + else + give_new_spell(random_spell()) qdel(src) + +/obj/item/weapon/spell/gambit/proc/give_new_spell(var/spell_type) + owner.drop_from_inventory(src, null) + owner.place_spell_in_hand(spell_type) + +// Gives a random spell. +/obj/item/weapon/spell/gambit/proc/random_spell() + var/list/potential_spells = all_technomancer_gambit_spells.Copy() + var/rare_spell_chance = between(0, calculate_spell_power(100) - 100, 100) // Having 120% spellpower means a 20% chance to get to roll for rare spells. + if(prob(rare_spell_chance)) + potential_spells += rare_spells.Copy() + to_chat(owner, "You feel a bit luckier...") + return pick(potential_spells) + +// Gives a "random" spell. +/obj/item/weapon/spell/gambit/proc/biased_random_spell() + var/list/potential_spells = list() + var/rare_spell_chance = between(0, calculate_spell_power(100) - 100, 100) + var/give_rare_spells = FALSE + if(prob(rare_spell_chance)) + give_rare_spells = TRUE + to_chat(owner, "You feel a bit luckier...") + + // First the spell will concern itself with the health of the technomancer. + if(prob(owner.getBruteLoss() + owner.getBruteLoss() * 2)) // Having 20 brute means a 40% chance of being added to the pool. + if(!owner.isSynthetic()) + potential_spells |= /obj/item/weapon/spell/modifier/mend_life + else + potential_spells |= /obj/item/weapon/spell/modifier/mend_synthetic + if(give_rare_spells) + potential_spells |= /obj/item/weapon/spell/modifier/mend_all + + // Second, the spell will try to prepare the technomancer for threats. + var/hostile_mobs = 0 // Counts how many hostile mobs. Higher numbers make it more likely for AoE spells to be chosen. + + for(var/mob/living/L in view(owner)) + // Spiders, carp... bears. + if(istype(L, /mob/living/simple_animal)) + var/mob/living/simple_animal/SM = L + if(!is_ally(SM) && SM.hostile) + hostile_mobs++ + if(SM.summoned || SM.supernatural) // Our creations might be trying to kill us. + potential_spells |= /obj/item/weapon/spell/abjuration + + // Always assume borgs are hostile. + if(istype(L, /mob/living/silicon/robot)) + if(!istype(L, /mob/living/silicon/robot/drone)) // Drones are okay, however. + hostile_mobs++ + potential_spells |= /obj/item/weapon/spell/projectile/ionic_bolt + + // Finally we get to humanoids. + if(istype(L, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = L + if(is_ally(H)) // Don't get scared by our apprentice. + continue + + for(var/obj/item/I in list(H.l_hand, H.r_hand)) + // Guns are scary. + if(istype(I, /obj/item/weapon/gun)) // Toy guns will count as well but oh well. + hostile_mobs++ + continue + // Strong melee weapons are scary as well. + else if(I.force >= 15) + hostile_mobs++ + continue + + if(hostile_mobs) + potential_spells |= /obj/item/weapon/spell/shield + potential_spells |= /obj/item/weapon/spell/reflect + potential_spells |= /obj/item/weapon/spell/targeting_matrix + potential_spells |= /obj/item/weapon/spell/warp_strike + + if(hostile_mobs >= 3) // Lots of baddies, give them AoE. + potential_spells |= /obj/item/weapon/spell/projectile/chain_lightning + potential_spells |= /obj/item/weapon/spell/projectile/chain_lightning/lesser + potential_spells |= /obj/item/weapon/spell/spawner/fire_blast + potential_spells |= /obj/item/weapon/spell/condensation + potential_spells |= /obj/item/weapon/spell/aura/frost + else + potential_spells |= /obj/item/weapon/spell/projectile/beam + potential_spells |= /obj/item/weapon/spell/projectile/overload + potential_spells |= /obj/item/weapon/spell/projectile/force_missile + potential_spells |= /obj/item/weapon/spell/projectile/lightning + + // Third priority is recharging the core. + if(core.energy / core.max_energy <= 0.5) + potential_spells |= /obj/item/weapon/spell/energy_siphon + potential_spells |= /obj/item/weapon/spell/instability_tap + + // Fallback method in case nothing gets added. + if(!potential_spells.len) + potential_spells = all_technomancer_gambit_spells.Copy() + + return pick(potential_spells) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm deleted file mode 100644 index 38f5b5dc55..0000000000 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/technomancer/spell/mend_wounds - name = "Mend Wounds" - desc = "Heals minor wounds, such as cuts, bruises, and other non-lifethreatening injuries. \ - Instability is split between the target and technomancer, if seperate." - spell_power_desc = "Healing amount increased." - cost = 50 - obj_path = /obj/item/weapon/spell/insert/mend_wounds - ability_icon_state = "tech_mendwounds" - category = SUPPORT_SPELLS - -/obj/item/weapon/spell/insert/mend_wounds - name = "mend wounds" - desc = "Watch your wounds close up before your eyes." - icon_state = "mend_wounds" - cast_methods = CAST_MELEE - aspect = ASPECT_BIOMED - light_color = "#FF5C5C" - inserting = /obj/item/weapon/inserted_spell/mend_wounds - -/obj/item/weapon/inserted_spell/mend_wounds/on_insert() - spawn(1) - if(ishuman(host)) - var/mob/living/carbon/human/H = host - var/heal_power = host == origin ? 10 : 30 - heal_power = round(heal_power * spell_power_at_creation, 1) - origin.adjust_instability(10) - for(var/i = 0, i<5,i++) - if(H) - H.adjustBruteLoss(-heal_power / 5) - sleep(1 SECOND) - on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm deleted file mode 100644 index 6ba36d44c6..0000000000 --- a/code/game/gamemodes/technomancer/spells/insert/purify.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/technomancer/spell/purify - name = "Purify" - desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such." - spell_power_desc = "Healing amount increased." - cost = 25 - obj_path = /obj/item/weapon/spell/insert/purify - ability_icon_state = "tech_purify" - category = SUPPORT_SPELLS - -/obj/item/weapon/spell/insert/purify - name = "purify" - desc = "Illness and toxins will be no more." - icon_state = "purify" - cast_methods = CAST_MELEE - aspect = ASPECT_BIOMED - light_color = "#03A728" - inserting = /obj/item/weapon/inserted_spell/purify - -/obj/item/weapon/inserted_spell/purify/on_insert() - spawn(1) - if(ishuman(host)) - var/mob/living/carbon/human/H = host - H.sdisabilities = 0 - H.disabilities = 0 -// for(var/datum/disease/D in H.viruses) -// D.cure() - var/heal_power = host == origin ? 10 : 30 - heal_power = round(heal_power * spell_power_at_creation, 1) - origin.adjust_instability(10) - for(var/i = 0, i<5,i++) - if(H) - H.adjustToxLoss(-heal_power / 5) - H.adjustCloneLoss(-heal_power / 5) - H.radiation = max(host.radiation - ( (heal_power * 2) / 5), 0) - - for(var/obj/item/organ/external/E in H.organs) - var/obj/item/organ/external/G = E - if(G.germ_level) - var/germ_heal = heal_power * 10 - G.germ_level = min(0, G.germ_level - germ_heal) - - for(var/obj/item/organ/internal/I in H.internal_organs) - var/obj/item/organ/internal/G = I - if(G.germ_level) - var/germ_heal = heal_power * 10 - G.germ_level = min(0, G.germ_level - germ_heal) - - sleep(1 SECOND) - on_expire() diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index 9092039165..13a2b5e318 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -1,8 +1,8 @@ /datum/technomancer/spell/instability_tap name = "Instability Tap" - desc = "Creates a large sum of energy, at the cost of a very large amount of instability afflicting you." + desc = "Creates a large sum of energy (5,000 at normal spell power), at the cost of a very large amount of instability afflicting you." enhancement_desc = "50% more energy gained, 20% less instability gained." - spell_power_desc = "Amount of energy gained scaled up with spell power." + spell_power_desc = "Amount of energy gained scaled with spell power." cost = 100 obj_path = /obj/item/weapon/spell/instability_tap ability_icon_state = "tech_instabilitytap" @@ -26,4 +26,5 @@ else core.give_energy(amount) adjust_instability(50) + playsound(get_turf(src), 'sound/effects/supermatter.ogg', 75, 1) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/mend_organs.dm b/code/game/gamemodes/technomancer/spells/mend_organs.dm new file mode 100644 index 0000000000..16c212f084 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/mend_organs.dm @@ -0,0 +1,56 @@ +/datum/technomancer/spell/mend_organs + name = "Mend Internals" + desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \ + robotic, reforms bones, patches internal bleeding, and restores missing blood." + spell_power_desc = "Healing amount increased." + cost = 100 + obj_path = /obj/item/weapon/spell/mend_organs + ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/mend_organs + name = "great mend wounds" + desc = "A walking medbay is now you!" + icon_state = "mend_wounds" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + +/obj/item/weapon/spell/mend_organs/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + var/heal_power = calculate_spell_power(40) + L.adjustBruteLoss(-heal_power) + L.adjustFireLoss(-heal_power) + user.adjust_instability(5) + L.adjust_instability(5) + + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom + + user.adjust_instability(5) + L.adjust_instability(5) + + for(var/obj/item/organ/O in H.internal_organs) + if(O.damage > 0) // Fix internal damage + O.damage = max(O.damage - (heal_power / 2), 0) + if(O.damage <= 5 && O.organ_tag == O_EYES) // Fix eyes + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) // Fix limbs + if(!O.robotic < ORGAN_ROBOT) // No robot parts for this. + continue + O.heal_damage(0, heal_power / 4, internal = 1, robo_repair = 0) + + for(var/obj/item/organ/E in H.bad_external_organs) // Fix bones + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + for(var/datum/wound/W in affected.wounds) // Fix IB + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + + H.restore_blood() // Fix bloodloss + qdel(src) diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm new file mode 100644 index 0000000000..1da3554573 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm @@ -0,0 +1,35 @@ +// Gambit only spell. Heals everything unconditionally. + +/obj/item/weapon/spell/modifier/mend_all + name = "mend all" + desc = "One function to heal them all." + icon_state = "mend_all" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_life + modifier_duration = 1 MINUTE + +/datum/modifier/technomancer/mend_all + name = "mend all" + desc = "You feel serene and well rested." + mob_overlay_state = "green_sparkles" + + on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away." + on_expired_text = "The sparkles have faded, although you feel much healthier than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/mend_all/tick() + if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal. + expire() + return + holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 120 damage over 1 minute, as tick() is run every 2 seconds. + holder.adjustFireLoss(-4 * spell_power) + holder.adjustToxLoss(-4 * spell_power) + holder.adjustOxyLoss(-4 * spell_power) + holder.adjustCloneLoss(-2 * spell_power) // 60 cloneloss + holder.adjust_instability(1) + if(origin) + var/mob/living/L = origin.resolve() + if(istype(L)) + L.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm new file mode 100644 index 0000000000..a766767b18 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm @@ -0,0 +1,44 @@ +/datum/technomancer/spell/mend_life + name = "Mend Life" + desc = "Heals minor wounds, such as cuts, bruises, burns, and other non-lifethreatening injuries. \ + Instability is split between the target and technomancer, if seperate. The function will end prematurely \ + if the target is completely healthy, preventing further instability." + spell_power_desc = "Healing amount increased." + cost = 50 + obj_path = /obj/item/weapon/spell/modifier/mend_life + ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/mend_life + name = "mend life" + desc = "Watch your wounds close up before your eyes." + icon_state = "mend_life" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_life + modifier_duration = 10 SECONDS + +/datum/modifier/technomancer/mend_life + name = "mend life" + desc = "You feel rather refreshed." + mob_overlay_state = "green_sparkles" + + on_created_text = "Sparkles begin to appear around you, and you feel really.. refreshed." + on_expired_text = "The sparkles have faded, although you feel healthier than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/mend_life/tick() + if(holder.isSynthetic()) // Don't heal synths! + expire() + return + if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal. + expire() + return + holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds. + holder.adjustFireLoss(-4 * spell_power) // Ditto. + holder.adjust_instability(1) + if(origin) + var/mob/living/L = origin.resolve() + if(istype(L)) + L.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm new file mode 100644 index 0000000000..d91530b0c9 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm @@ -0,0 +1,44 @@ +/datum/technomancer/spell/mend_synthetic + name = "Mend Synthetic" + desc = "Repairs minor damages to robotic entities. \ + Instability is split between the target and technomancer, if seperate. The function will end prematurely \ + if the target is completely healthy, preventing further instability." + spell_power_desc = "Healing amount increased." + cost = 50 + obj_path = /obj/item/weapon/spell/modifier/mend_synthetic + ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/mend_synthetic + name = "mend synthetic" + desc = "You are the Robotics lab" + icon_state = "mend_synthetic" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED // sorta?? + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_synthetic + modifier_duration = 10 SECONDS + +/datum/modifier/technomancer/mend_synthetic + name = "mend synthetic" + desc = "Something seems to be repairing you." + mob_overlay_state = "cyan_sparkles" + + on_created_text = "Sparkles begin to appear around you, and your systems report integrity rising." + on_expired_text = "The sparkles have faded, although your systems seem to be better than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/mend_synthetic/tick() + if(!holder.isSynthetic()) // Don't heal biologicals! + expire() + return + if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal. + expire() + return + holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds. + holder.adjustFireLoss(-4 * spell_power) // Ditto. + holder.adjust_instability(1) + if(origin) + var/mob/living/L = origin.resolve() + if(istype(L)) + L.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/modifier.dm b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm index b0a5c93747..a8b9306945 100644 --- a/code/game/gamemodes/technomancer/spells/modifier/modifier.dm +++ b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm @@ -26,6 +26,13 @@ var/duration = modifier_duration if(duration) duration = round(duration * calculate_spell_power(1.0), 1) - L.add_modifier(modifier_type, duration) + var/datum/modifier/M = L.add_modifier(modifier_type, duration, owner) + if(istype(M, /datum/modifier/technomancer)) + var/datum/modifier/technomancer/MT = M + MT.spell_power = calculate_spell_power(1) log_and_message_admins("has casted [src] on [L].") - qdel(src) \ No newline at end of file + qdel(src) + +// Technomancer specific subtype which keeps track of spell power and gets targeted specificially by Dispel. +/datum/modifier/technomancer + var/spell_power = null // Set by on_add_modifier. \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/purify.dm b/code/game/gamemodes/technomancer/spells/modifier/purify.dm new file mode 100644 index 0000000000..ae90a04cb1 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/purify.dm @@ -0,0 +1,40 @@ +/datum/technomancer/spell/purify + name = "Purify" + desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \ + Instability is split between the target and technomancer, if seperate. The function will end prematurely \ + if the target is completely healthy, preventing further instability." + spell_power_desc = "Healing amount increased." + cost = 25 + obj_path = /obj/item/weapon/spell/modifier/purify + ability_icon_state = "tech_purify" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/purify + name = "mend life" + desc = "Watch your wounds close up before your eyes." + icon_state = "mend_life" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/purify + modifier_duration = 10 SECONDS + +/datum/modifier/technomancer/purify + name = "purify" + desc = "You feel rather clean and pure." + mob_overlay_state = "green_sparkles" + + on_created_text = "Sparkles begin to appear around you, and you feel really.. pure." + on_expired_text = "The sparkles have faded, although you feel healthier than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/purify/tick() + if(!holder.getToxLoss()) // No point existing if the spell can't heal. + expire() + return + holder.adjustToxLoss(-4 * spell_power) // Should heal roughly 120 damage over 1 minute, as tick() is run every 2 seconds. + holder.adjust_instability(1) + if(origin) + var/mob/living/L = origin.resolve() + if(istype(L)) + L.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm index d267ecce88..6ead04f30c 100644 --- a/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm +++ b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm @@ -1,6 +1,6 @@ /datum/technomancer/spell/repel_missiles name = "Repel Missiles" - desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \ + desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 45% less likely \ to hit you. The field lasts for 10 minutes and can be granted to yourself or an ally." cost = 25 obj_path = /obj/item/weapon/spell/modifier/repel_missiles diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index b121e6f4d4..fcc2cbcecf 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -2,7 +2,7 @@ name = "Oxygenate" desc = "This function creates oxygen at a location of your chosing. If used on a humanoid entity, it heals oxygen deprivation. \ If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target." - cost = 50 + cost = 25 obj_path = /obj/item/weapon/spell/oxygenate ability_icon_state = "oxygenate" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm index acb00a2c7f..5614d04a88 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm @@ -32,7 +32,7 @@ var/bounces = 3 //How many times it 'chains'. Note that the first hit is not counted as it counts /bounces/. var/list/hit_mobs = list() //Mobs which were already hit. - var/power = 20 //How hard it will hit for with electrocute_act(), decreases with each bounce. + var/power = 35 //How hard it will hit for with electrocute_act(), decreases with each bounce. /obj/item/projectile/beam/chain_lightning/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) //First we shock the guy we just hit. diff --git a/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm b/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm index 68070d15c1..d6665b2ee0 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm @@ -2,7 +2,7 @@ name = "Ionic Bolt" desc = "Shoots a bolt of ion energy at the target. If it hits something, it will generally drain energy, corrupt electronics, \ or otherwise ruin complex machinery." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/spell/projectile/ionic_bolt category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/lesser_chain_lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lesser_chain_lightning.dm new file mode 100644 index 0000000000..85881fefb0 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/lesser_chain_lightning.dm @@ -0,0 +1,23 @@ +/datum/technomancer/spell/lesser_chain_lightning + name = "Lesser Chain Lightning" + desc = "This is very similar to the function Chain Lightning, however it is considerably less powerful. As a result, it's a lot \ + more economical in terms of energy cost, as well as instability generation. Lightning functions cannot miss due to distance." + cost = 100 + obj_path = /obj/item/weapon/spell/projectile/chain_lightning/lesser + ability_icon_state = "tech_chain_lightning" + category = OFFENSIVE_SPELLS + +/obj/item/weapon/spell/projectile/chain_lightning/lesser + name = "lesser chain lightning" + icon_state = "chain_lightning" + desc = "Now you can throw around lightning like it's nobody's business." + cast_methods = CAST_RANGED + aspect = ASPECT_SHOCK + spell_projectile = /obj/item/projectile/beam/chain_lightning + energy_cost_per_shot = 1000 + instability_per_shot = 5 + cooldown = 10 + +/obj/item/projectile/beam/chain_lightning/lesser + bounces = 2 + power = 20 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm index 291c74f7fa..4ea507e959 100644 --- a/code/game/gamemodes/technomancer/spells/shield.dm +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -37,8 +37,10 @@ if(issmall(user)) // Smaller shields are more efficent. damage_to_energy_cost *= 0.75 - if(istype(owner.get_other_hand(src), src.type)) // Two shields in both hands. - damage_to_energy_cost *= 0.75 + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + if(istype(H.get_other_hand(src), src.type)) // Two shields in both hands. + damage_to_energy_cost *= 0.75 else if(check_for_scepter()) damage_to_energy_cost *= 0.50 diff --git a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm new file mode 100644 index 0000000000..38172b0d14 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm @@ -0,0 +1,53 @@ +/datum/technomancer/spell/destablize + name = "Destablize" + desc = "Creates an unstable disturbance at the targeted tile, which will afflict anyone nearby with instability who remains nearby. This can affect you \ + and your allies as well. The disturbance lasts for twenty seconds." + cost = 100 + obj_path = /obj/item/weapon/spell/spawner/destablize + category = OFFENSIVE_SPELLS + +/obj/item/weapon/spell/spawner/destablize + name = "destablize" + desc = "Now your enemies can feel what you go through when you have too much fun." + icon_state = "destablize" + cast_methods = CAST_RANGED + aspect = ASPECT_UNSTABLE + spawner_type = /obj/effect/temporary_effect/destablize + +/obj/item/weapon/spell/spawner/destablize/New() + ..() + set_light(3, 2, l_color = "#C26DDE") + +/obj/item/weapon/spell/spawner/destablize/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(2000)) + adjust_instability(15) + ..() + +/obj/effect/temporary_effect/destablize + name = "destablizing disturbance" + desc = "This can't be good..." + icon = 'icons/effects/effects.dmi' + icon_state = "blueshatter" + time_to_die = null + invisibility = 0 + new_light_range = 6 + new_light_power = 20 + new_light_color = "#C26DDE" + var/pulses_remaining = 40 // Lasts 20 seconds. + var/instability_power = 5 + var/instability_range = 6 + +/obj/effect/temporary_effect/destablize/New() + ..() + radiate_loop() + +/obj/effect/temporary_effect/destablize/proc/radiate_loop() + while(pulses_remaining) + sleep(5) + for(var/mob/living/L in range(src, instability_range) ) + var/radius = max(get_dist(L, src), 1) + // Being farther away lessens the amount of instabity received. + var/outgoing_instability = instability_power * ( 1 / (radius**2) ) + L.receive_radiated_instability(outgoing_instability) + pulses_remaining-- + qdel(src) \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index e8b24b0446..e0efde55ad 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -66,6 +66,7 @@ minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) alt_titles = list("Maintenance Technician","Engine Technician","Electrician") + minimal_player_age = 3 /datum/job/engineer/equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index ba083031e7..4d56d6662d 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -14,8 +14,8 @@ /obj/machinery/optable/New() ..() - for(dir in list(NORTH,EAST,SOUTH,WEST)) - computer = locate(/obj/machinery/computer/operating, get_step(src, dir)) + for(var/direction in list(NORTH,EAST,SOUTH,WEST)) + computer = locate(/obj/machinery/computer/operating, get_step(src, direction)) if(computer) computer.table = src break diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index e308f75d18..12fafff5ff 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -12,7 +12,7 @@ /obj/machinery/computer/operating/New() ..() - for(var/direction in list(NORTH,EAST,SOUTH,WEST)) //VOREStation Edit - Stop turning + for(var/direction in list(NORTH,EAST,SOUTH,WEST)) table = locate(/obj/machinery/optable, get_step(src, direction)) if (table) table.computer = src diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 176e2d7743..36974b159f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -91,7 +91,7 @@ . = ..() /obj/machinery/computer/security/attack_hand(var/mob/user as mob) - if (using_map && !(src.z in using_map.station_levels)) + if (using_map && !(src.z in using_map.contact_levels)) user << "Unable to establish a connection: You're too far away from the station!" return if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 59f4e78151..a8b6ee2424 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -52,7 +52,7 @@ /obj/machinery/computer/communications/Topic(href, href_list) if(..()) return 1 - if (using_map && !(src.z in using_map.station_levels)) //VOREStation Edit + if (using_map && !(src.z in using_map.contact_levels)) usr << "\red Unable to establish a connection: \black You're too far away from the station!" return usr.set_machine(src) @@ -274,7 +274,7 @@ /obj/machinery/computer/communications/attack_hand(var/mob/user as mob) if(..()) return - if (using_map && !(src.z in using_map.station_levels)) + if (using_map && !(src.z in using_map.contact_levels)) user << "\red Unable to establish a connection: \black You're too far away from the station!" return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index abbf65b44f..8def6db394 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -26,7 +26,7 @@ attackby(obj/item/weapon/O as obj, mob/user as mob) - if (user.z > 6) + if (using_map && !(user.z in using_map.contact_levels)) user << "Unable to establish a connection: You're too far away from the station!" return if(istype(O, /obj/item/weapon/aiModule)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 4c31aa8ad9..1179d3a2b2 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -56,7 +56,7 @@ /obj/machinery/computer/secure_data/attack_hand(mob/user as mob) if(..()) return - if (using_map && !(src.z in using_map.station_levels)) + if (using_map && !(src.z in using_map.contact_levels)) user << "Unable to establish a connection: You're too far away from the station!" return var/dat diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 9647204e97..fb92e700ff 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -39,7 +39,7 @@ /obj/machinery/computer/skills/attack_hand(mob/user as mob) if(..()) return - if (using_map && !(src.z in using_map.station_levels)) + if (using_map && !(src.z in using_map.contact_levels)) user << "Unable to establish a connection: You're too far away from the station!" return var/dat diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index f456a95d73..8dfe627030 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -42,6 +42,7 @@ M.facing_dir = null M.set_dir(buckle_dir ? buckle_dir : dir) M.update_canmove() + M.update_floating( M.Check_Dense_Object() ) buckled_mob = M post_buckle_mob(M) @@ -53,6 +54,7 @@ buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.update_canmove() + buckled_mob.update_floating( buckled_mob.Check_Dense_Object() ) buckled_mob = null post_buckle_mob(.) diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 73efffe121..8b048a035e 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -75,7 +75,7 @@ if(user.r_hand && user.l_hand) cell.forceMove(get_turf(user)) else - cell.forceMove(user.put_in_hands(cell)) + user.put_in_hands(cell) cell = null playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) else @@ -141,14 +141,15 @@ sleep(15 SECONDS) break - if(patient.client) - patient.adjustOxyLoss(-20) //Look, blood stays oxygenated for quite some time, but I'm not recoding the entire oxy system - patient.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again. - dead_mob_list -= patient - living_mob_list += patient - patient.timeofdeath = null - patient.visible_message("[patient]'s eyes open!") - log_and_message_admins("[patient] was revived.") + if(!(HUSK in patient.mutations)) // Husked people can't come back with a Defib. + if(patient.client) + patient.adjustOxyLoss(-20) //Look, blood stays oxygenated for quite some time, but I'm not recoding the entire oxy system + patient.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again. + dead_mob_list -= patient + living_mob_list += patient + patient.timeofdeath = null + patient.visible_message("[patient]'s eyes open!") + log_and_message_admins("[patient] was revived by a defib.") cell.charge -= charge_cost //Always charge the cost after any attempt, failed or not sleep(20) //Wait 2 seconds before next attempt statechange(1,patient) //Back to ready diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9b573a2cf1..c3cbf5f7ef 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -73,7 +73,7 @@ if(brightness_level == "low") set_light(brightness_on/2) else if(brightness_level == "high") - set_light(brightness_on*4) + set_light(brightness_on*1.5) else set_light(brightness_on) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index f0d5be1dde..fcdd22b441 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -16,9 +16,9 @@ var/global/list/active_radio_jammers = list() /obj/item/device/radio_jammer name = "subspace jammer" desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators." - icon = 'icons/obj/device_alt.dmi' - icon_state = "shield0" - var/active_state = "shield1" + icon = 'icons/obj/device.dmi' + icon_state = "jammer0" + var/active_state = "jammer1" var/on = 0 var/jam_range = 7 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 241e5c008f..519fff3d50 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -34,15 +34,16 @@ w_class = ITEMSIZE_LARGE max_w_class = ITEMSIZE_SMALL + max_storage_space = ITEMSIZE_SMALL * 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) /obj/item/weapon/storage/bag/trash/update_icon() if(contents.len == 0) icon_state = "trashbag0" - else if(contents.len < 12) + else if(contents.len < 9) icon_state = "trashbag1" - else if(contents.len < 21) + else if(contents.len < 18) icon_state = "trashbag2" else icon_state = "trashbag3" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index fd8a3c69f8..e4ee4806e2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -177,6 +177,7 @@ var/list/admin_verbs_debug = list( /client/proc/debug_controller, /client/proc/debug_antagonist_template, /client/proc/cmd_debug_mob_lists, + /client/proc/cmd_debug_using_map, /client/proc/cmd_admin_delete, /client/proc/cmd_debug_del_all, /client/proc/cmd_debug_tog_aliens, @@ -291,6 +292,7 @@ var/list/admin_verbs_hideable = list( /client/proc/debug_controller, /client/proc/startSinglo, /client/proc/cmd_debug_mob_lists, + /client/proc/cmd_debug_using_map, /client/proc/cmd_debug_del_all, /client/proc/cmd_debug_tog_aliens, /client/proc/air_report, diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 64514afd21..73e570228d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -943,6 +943,15 @@ if("Clients") usr << jointext(clients,",") +/client/proc/cmd_debug_using_map() + set category = "Debug" + set name = "Debug Map Datum" + set desc = "Debug the map metadata about the currently compiled in map." + + if(!check_rights(R_DEBUG)) + return + debug_variables(using_map) + // DNA2 - Admin Hax /client/proc/cmd_admin_toggle_block(var/mob/M,var/block) if(!ticker) diff --git a/code/modules/busy_space/loremaster.dm b/code/modules/busy_space/loremaster.dm index 30bd04402d..28dca0055b 100644 --- a/code/modules/busy_space/loremaster.dm +++ b/code/modules/busy_space/loremaster.dm @@ -9,5 +9,8 @@ var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization for(var/path in paths) - var/datum/lore/organization/instance = new path() - organizations[path] = instance \ No newline at end of file + // Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names + var/datum/lore/organization/instance = path + if(initial(instance.name)) + instance = new path() + organizations[path] = instance diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index 439e1f1b7f..84f694d2ef 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -326,12 +326,12 @@ // Military /datum/lore/organization/mil/sif_guard - name = "Sif Homeguard Forces" // Todo: Get better name from lorepeople. + name = "Sif Defense Force" // Todo: Get better name from lorepeople. short_name = "SifGuard" desc = "" history = "" work = "Sif Governmental Authority's military" - headquarters = "Sif" // Make this more specific later. + headquarters = "New Reykjavik, Sif" motto = "" autogenerate_destination_names = FALSE // Kinda weird if SifGuard goes to Nyx. diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index bc22cbad24..871c31ec34 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -383,4 +383,12 @@ /datum/gear/suit/miscellaneous/med_dep_jacket display_name = "department jacket, medical" - path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket \ No newline at end of file + path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket + +/datum/gear/suit/miscellaneous/peacoat + display_name = "peacoat" + path = /obj/item/clothing/suit/storage/toggle/peacoat + +/datum/gear/suit/miscellaneous/peacoat/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 881da0b8c8..8974cc004d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -20,22 +20,21 @@ cheongasms[initial(cheongasm_type.name)] = cheongasm_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cheongasms)) +/datum/gear/uniform/croptop + display_name = "croptop selection" + +/datum/gear/uniform/croptop/New() + ..() + var/list/croptops = list() + for(var/croptop in typesof(/obj/item/clothing/under/croptop)) + var/obj/item/clothing/under/croptop/croptop_type = croptop + croptops[initial(croptop_type.name)] = croptop_type + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(croptops)) + /datum/gear/uniform/kilt display_name = "kilt" path = /obj/item/clothing/under/kilt -/datum/gear/uniform/croptop - display_name = "croptop, NT" - path = /obj/item/clothing/under/croptop - -/datum/gear/uniform/croptop/grey - display_name = "croptop, grey" - path = /obj/item/clothing/under/croptop/grey - -/datum/gear/uniform/croptop/red - display_name = "croptop, red" - path = /obj/item/clothing/under/croptop/red - /datum/gear/uniform/cuttop display_name = "cut top, grey" path = /obj/item/clothing/under/cuttop @@ -182,65 +181,33 @@ path = /obj/item/clothing/under/rank/cargotech/jeans/female allowed_roles = list("Quartermaster","Cargo Technician") -/datum/gear/uniform/suit //amish - display_name = "suit, amish" - path = /obj/item/clothing/under/sl_suit +/datum/gear/uniform/suit/lawyer + display_name = "suit, one-piece selection" + path = /obj/item/clothing/under/lawyer -/datum/gear/uniform/suit/black - display_name = "suit, black" +/datum/gear/uniform/suit/lawyer/New() + ..() + var/list/lsuits = list() + for(var/lsuit in typesof(/obj/item/clothing/under/lawyer)) + var/obj/item/clothing/suit/lsuit_type = lsuit + lsuits[initial(lsuit_type.name)] = lsuit_type + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(lsuits)) + +/datum/gear/uniform/suit/suit_jacket + display_name = "suit, modular selection" path = /obj/item/clothing/under/suit_jacket -/datum/gear/uniform/suit/shinyblack - display_name = "suit, shiny-black" - path = /obj/item/clothing/under/lawyer/black +/datum/gear/uniform/suit/suit_jacket/New() + ..() + var/list/msuits = list() + for(var/msuit in typesof(/obj/item/clothing/under/suit_jacket)) + var/obj/item/clothing/suit/msuit_type = msuit + msuits[initial(msuit_type.name)] = msuit_type + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(msuits)) -/datum/gear/uniform/suit/shinyblackskirt - display_name = "suit, shiny-black skirt" - path = /obj/item/clothing/under/lawyer/black/skirt - -/datum/gear/uniform/suit/blue - display_name = "suit, blue" - path = /obj/item/clothing/under/lawyer/blue - -/datum/gear/uniform/suit/blueskirt - display_name = "suit, blue skirt" - path = /obj/item/clothing/under/lawyer/blue/skirt - -/datum/gear/uniform/suit/burgundy - display_name = "suit, burgundy" - path = /obj/item/clothing/under/suit_jacket/burgundy - -/datum/gear/uniform/suit/burgundyskirt - display_name = "suit, burgundy skirt" - path = /obj/item/clothing/under/suit_jacket/burgundy/skirt - -/datum/gear/uniform/suit/checkered - display_name = "suit, checkered" - path = /obj/item/clothing/under/suit_jacket/checkered - -/datum/gear/uniform/suit/checkeredskirt - display_name = "suit, checkered skirt" - path = /obj/item/clothing/under/suit_jacket/checkered/skirt - -/datum/gear/uniform/suit/charcoal - display_name = "suit, charcoal" - path = /obj/item/clothing/under/suit_jacket/charcoal - -/datum/gear/uniform/suit/charcoalskirt - display_name = "suit, charcoal skirt" - path = /obj/item/clothing/under/suit_jacket/charcoal/skirt - -/datum/gear/uniform/suit/exec - display_name = "suit, executive" - path = /obj/item/clothing/under/suit_jacket/really_black - -/datum/gear/uniform/suit/execskirt - display_name = "suit, executive skirt" - path = /obj/item/clothing/under/suit_jacket/really_black/skirt - -/datum/gear/uniform/suit/femaleexec - display_name = "suit, female-executive" - path = /obj/item/clothing/under/suit_jacket/female +/datum/gear/uniform/suit/amish //amish + display_name = "suit, amish" + path = /obj/item/clothing/under/sl_suit /datum/gear/uniform/suit/gentle display_name = "suit, gentlemen" @@ -250,50 +217,6 @@ display_name = "suit, lady" path = /obj/item/clothing/under/gentlesuit/skirt -/datum/gear/uniform/suit/navy - display_name = "suit, navy" - path = /obj/item/clothing/under/suit_jacket/navy - -/datum/gear/uniform/suit/navyskirt - display_name = "suit, navy skirt" - path = /obj/item/clothing/under/suit_jacket/navy/skirt - -/datum/gear/uniform/suit/red - display_name = "suit, red" - path = /obj/item/clothing/under/suit_jacket/red - -/datum/gear/uniform/suit/redskirt - display_name = "suit, red skirt" - path = /obj/item/clothing/under/suit_jacket/red/skirt - -/datum/gear/uniform/suit/redlawyer - display_name = "suit, lawyer-red" - path = /obj/item/clothing/under/lawyer/red - -/datum/gear/uniform/suit/redlawyerskirt - display_name = "suit, lawyer-red skirt" - path = /obj/item/clothing/under/lawyer/red/skirt - -/datum/gear/uniform/suit/oldman - display_name = "suit, old-man" - path = /obj/item/clothing/under/lawyer/oldman - -/datum/gear/uniform/suit/purple - display_name = "suit, purple" - path = /obj/item/clothing/under/lawyer/purpsuit - -/datum/gear/uniform/suit/purpleskirt - display_name = "suit, purple skirt" - path = /obj/item/clothing/under/lawyer/purpsuit/skirt - -/datum/gear/uniform/suit/tan - display_name = "suit, tan" - path = /obj/item/clothing/under/suit_jacket/tan - -/datum/gear/uniform/suit/tanskirt - display_name = "suit, tan skirt" - path = /obj/item/clothing/under/suit_jacket/tan/skirt - /datum/gear/uniform/suit/white display_name = "suit, white" path = /obj/item/clothing/under/scratch @@ -302,14 +225,6 @@ display_name = "suit, white skirt" path = /obj/item/clothing/under/scratch/skirt -/datum/gear/uniform/suit/whiteblue - display_name = "suit, white-blue" - path = /obj/item/clothing/under/lawyer/bluesuit - -/datum/gear/uniform/suit/whiteblueskirt - display_name = "suit, white-blue skirt" - path = /obj/item/clothing/under/lawyer/bluesuit/skirt - /datum/gear/uniform/suit/detectiveskirt display_name = "suit, detective skirt (Detective)" path = /obj/item/clothing/under/det/skirt @@ -348,7 +263,7 @@ /datum/gear/uniform/oldwoman display_name = "old woman attire" - path = /obj/item/clothing/under/lawyer/oldwoman + path = /obj/item/clothing/under/oldwoman /datum/gear/uniform/sundress display_name = "sundress" @@ -531,4 +446,16 @@ /datum/gear/uniform/yogapants/New() ..() - gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/uniform/black_corset + display_name = "black corset" + path = /obj/item/clothing/under/dress/black_corset + +/datum/gear/uniform/flower_dress + display_name = "flower dress" + path = /obj/item/clothing/under/dress/flower_dress + +/datum/gear/uniform/red_swept_dress + display_name = "red swept dress" + path = /obj/item/clothing/under/dress/red_swept_dress \ No newline at end of file diff --git a/code/modules/clothing/head/solgov.dm b/code/modules/clothing/head/solgov.dm index f7d4c417b4..bd9ef27f4b 100644 --- a/code/modules/clothing/head/solgov.dm +++ b/code/modules/clothing/head/solgov.dm @@ -12,7 +12,7 @@ /obj/item/clothing/head/soft/sol/expedition name = "\improper SifGuard cap" - desc = "It's a black ballcap bearing a Sif Homeguard Corps crest." + desc = "It's a black ballcap bearing a Sif Defense Force crest." icon_state = "expeditionsoft" item_state_slots = list( slot_l_hand_str = "blacksoft", @@ -115,12 +115,12 @@ /obj/item/clothing/head/dress/expedition name = "\improper SifGuard dress cap" - desc = "A peaked grey dress uniform cap belonging to the Sif Homeguard Corps." + desc = "A peaked grey dress uniform cap belonging to the Sif Defense Force." icon_state = "greydresscap" /obj/item/clothing/head/dress/expedition/command name = "\improper SifGuard command dress cap" - desc = "A peaked grey dress uniform cap belonging to the Sif Homeguard Corps. This one is trimmed in gold." + desc = "A peaked grey dress uniform cap belonging to the Sif Defense Force. This one is trimmed in gold." icon_state = "greydresscap_com" /obj/item/clothing/head/dress/fleet @@ -150,11 +150,6 @@ desc = "A beret in Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety." icon_state = "beret_lightblue" -/obj/item/clothing/head/beret/sol/homeguard - name = "home guard beret" - desc = "A red beret denoting service in the Sol Home Guard. For personnel that are more inclined towards style than safety." - icon_state = "beret_red" - /obj/item/clothing/head/beret/sol/gateway name = "gateway administration beret" desc = "An orange beret denoting service in the Gateway Administration. For personnel that are more inclined towards style than safety." @@ -182,32 +177,32 @@ /obj/item/clothing/head/beret/sol/expedition name = "\improper SifGuard beret" - desc = "A black beret belonging to the Sif Homeguard Corps. For personnel that are more inclined towards style than safety." + desc = "A black beret belonging to the Sif Defense Force. For personnel that are more inclined towards style than safety." icon_state = "beret_black" /obj/item/clothing/head/beret/sol/expedition/security name = "\improper SifGuard security beret" - desc = "An Sif Homeguard Corps beret with a security crest. For personnel that are more inclined towards style than safety." + desc = "A Sif Defense Force beret with a security crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_security" /obj/item/clothing/head/beret/sol/expedition/medical name = "\improper SifGuard medical beret" - desc = "An Sif Homeguard Corps beret with a medical crest. For personnel that are more inclined towards style than safety." + desc = "A Sif Defense Force beret with a medical crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_medical" /obj/item/clothing/head/beret/sol/expedition/engineering name = "\improper SifGuard engineering beret" - desc = "An Sif Homeguard Corps beret with an engineering crest. For personnel that are more inclined towards style than safety." + desc = "A Sif Defense Force beret with an engineering crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_engineering" /obj/item/clothing/head/beret/sol/expedition/supply name = "\improper SifGuard supply beret" - desc = "An Sif Homeguard Corps beret with a supply crest. For personnel that are more inclined towards style than safety." + desc = "A Sif Defense Force beret with a supply crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_supply" /obj/item/clothing/head/beret/sol/expedition/command name = "\improper SifGuard command beret" - desc = "An Sif Homeguard Corps beret with a command crest. For personnel that are more inclined towards style than safety." + desc = "A Sif Defense Force beret with a command crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_command" /obj/item/clothing/head/beret/sol/fleet diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index cd345fc8aa..7ce74c610e 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -340,6 +340,12 @@ obj/item/clothing/suit/kimono item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") flags_inv = HIDEHOLSTER +obj/item/clothing/suit/storage/toggle/peacoat + name = "peacoat" + desc = "A well-tailored, stylish peacoat." + icon_state = "peacoat" + item_state_slots = list(slot_r_hand_str = "peacoat", slot_l_hand_str = "peacoat") + flags_inv = HIDEHOLSTER /* * stripper */ diff --git a/code/modules/clothing/suits/solgov.dm b/code/modules/clothing/suits/solgov.dm index 87e4ca02fb..154772fe68 100644 --- a/code/modules/clothing/suits/solgov.dm +++ b/code/modules/clothing/suits/solgov.dm @@ -14,47 +14,47 @@ /obj/item/clothing/suit/storage/service/expeditionary name = "\improper SifGuard jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons." icon_state = "blackservice_crew" /obj/item/clothing/suit/storage/service/expeditionary/medical name = "\improper SifGuard medical jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and blue trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and blue trim." icon_state = "blackservice_med" /obj/item/clothing/suit/storage/service/expeditionary/medical/command name = "\improper SifGuard medical command jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and blue trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and blue trim." icon_state = "blackservice_medcom" /obj/item/clothing/suit/storage/service/expeditionary/engineering name = "\improper SifGuard engineering jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and orange trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and orange trim." icon_state = "blackservice_eng" /obj/item/clothing/suit/storage/service/expeditionary/engineering/command name = "\improper SifGuard engineering command jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and orange trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and orange trim." icon_state = "blackservice_engcom" /obj/item/clothing/suit/storage/service/expeditionary/supply name = "\improper SifGuard supply jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and brown trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and brown trim." icon_state = "blackservice_sup" /obj/item/clothing/suit/storage/service/expeditionary/security name = "\improper SifGuard security jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and red trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and red trim." icon_state = "blackservice_sec" /obj/item/clothing/suit/storage/service/expeditionary/security/command name = "\improper SifGuard security command jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and red trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and red trim." icon_state = "blackservice_seccom" /obj/item/clothing/suit/storage/service/expeditionary/command name = "\improper SifGuard command jacket" - desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and gold trim." + desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and gold trim." icon_state = "blackservice_com" /obj/item/clothing/suit/storage/service/marine @@ -115,13 +115,13 @@ allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) /obj/item/clothing/suit/dress/expedition - name = "expeditionary dress jacket" - desc = "A silver and grey dress jacket belonging to the SCG Expeditionary Corps. Fashionable, for the 25th century at least." + name = "SifGuard dress jacket" + desc = "A silver and grey dress jacket belonging to the Sif Defense Force. Fashionable, for the 25th century at least." icon_state = "greydress" /obj/item/clothing/suit/dress/expedition/command - name = "expeditionary command dress jacket" - desc = "A gold and grey dress jacket belonging to the SCG Expeditionary Corps. The height of fashion." + name = "SifGuard command dress jacket" + desc = "A gold and grey dress jacket belonging to the Sif Defense Force. The height of fashion." icon_state = "greydress_com" /obj/item/clothing/suit/storage/toggle/dress @@ -136,7 +136,7 @@ desc = "A crisp white SCG Fleet dress jacket with blue and gold accents. Don't get near pasta sauce or vox." /obj/item/clothing/suit/storage/toggle/dress/fleet/command - name = "expeditionary command dress jacket" + name = "fleet command dress jacket" desc = "A crisp white SCG Fleet dress jacket dripping with gold accents. So bright it's blinding." icon_state = "whitedress_com" item_state = "labcoat" diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index d14cff333b..87e6fa5bf9 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -117,37 +117,37 @@ /obj/item/clothing/under/lawyer desc = "Slick threads." - name = "Lawyer suit" + name = "lawyer suit" /obj/item/clothing/under/lawyer/black - name = "black Lawyer suit" + name = "black lawyer suit" icon_state = "lawyer_black" /obj/item/clothing/under/lawyer/black/skirt - name = "black Lawyer skirt" + name = "black lawyer skirt" icon_state = "lawyer_black_skirt" item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") /obj/item/clothing/under/lawyer/female - name = "black Lawyer suit" + name = "black lawyer suit" icon_state = "black_suit_fem" item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") /obj/item/clothing/under/lawyer/red - name = "red Lawyer suit" + name = "red lawyer suit" icon_state = "lawyer_red" /obj/item/clothing/under/lawyer/red/skirt - name = "red Lawyer skirt" + name = "red lawyer skirt" icon_state = "lawyer_red_skirt" item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red") /obj/item/clothing/under/lawyer/blue - name = "blue Lawyer suit" + name = "blue lawyer suit" icon_state = "lawyer_blue" /obj/item/clothing/under/lawyer/blue/skirt - name = "blue Lawyer skirt" + name = "blue lawyer skirt" icon_state = "lawyer_blue_skirt" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") @@ -163,7 +163,7 @@ icon_state = "bluesuit_skirt" /obj/item/clothing/under/lawyer/purpsuit - name = "purple Suit" + name = "purple suit" icon_state = "lawyer_purp" item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") @@ -177,7 +177,7 @@ icon_state = "oldman" item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny") -/obj/item/clothing/under/lawyer/oldwoman +/obj/item/clothing/under/oldwoman name = "Old Woman's Attire" desc = "A typical outfit for the older woman, a lovely cardigan and comfortable skirt." icon_state = "oldwoman" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index f58d601d8a..d3d336e075 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -374,6 +374,21 @@ icon_state = "huresource" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS +/obj/item/clothing/under/dress/black_corset + name = "black corset" + desc = "A black corset and skirt for those fancy nights out." + icon_state = "black_corset" + +/obj/item/clothing/under/dress/flower_dress + name = "flower dress" + desc = "A beautiful dress with a skirt of flowers." + icon_state = "flower_dress" + +/obj/item/clothing/under/dress/red_swept_dress + name = "red swept dress" + desc = "A red dress that sweeps to the side." + icon_state = "red_swept_dress" + /* * wedding stuff */ diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 114f386b76..040f7630b1 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -12,7 +12,7 @@ /obj/item/clothing/under/pt/expeditionary name = "\improper SifGuard pt uniform" - desc = "A baggy shirt bearing the seal of the Sif Homeguard Corps and some dorky looking blue shorts." + desc = "A baggy shirt bearing the seal of the Sif Defense Force and some dorky looking blue shorts." icon_state = "expeditionpt" worn_state = "expeditionpt" @@ -41,56 +41,56 @@ /obj/item/clothing/under/utility/expeditionary name = "\improper SifGuard uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has silver trim." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim." icon_state = "blackutility_crew" worn_state = "blackutility_crew" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10) /obj/item/clothing/under/utility/expeditionary/medical name = "\improper SifGuard medical uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has silver trim and blue blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and blue blazes." icon_state = "blackutility_med" worn_state = "blackutility_med" /obj/item/clothing/under/utility/expeditionary/medical/command name = "\improper SifGuard medical command uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has gold trim and blue blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and blue blazes." icon_state = "blackutility_medcom" worn_state = "blackutility_medcom" /obj/item/clothing/under/utility/expeditionary/engineering name = "\improper SifGuard engineering uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has silver trim and organge blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and organge blazes." icon_state = "blackutility_eng" worn_state = "blackutility_eng" /obj/item/clothing/under/utility/expeditionary/engineering/command name = "\improper SifGuard engineering command uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has gold trim and organge blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and organge blazes." icon_state = "blackutility_engcom" worn_state = "blackutility_engcom" /obj/item/clothing/under/utility/expeditionary/supply name = "\improper SifGuard supply uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has silver trim and brown blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and brown blazes." icon_state = "blackutility_sup" worn_state = "blackutility_sup" /obj/item/clothing/under/utility/expeditionary/security name = "\improper SifGuard security uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has silver trim and red blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and red blazes." icon_state = "blackutility_sec" worn_state = "blackutility_sec" /obj/item/clothing/under/utility/expeditionary/security/command name = "\improper SifGuard security command uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has gold trim and red blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and red blazes." icon_state = "blackutility_seccom" worn_state = "blackutility_seccom" /obj/item/clothing/under/utility/expeditionary/command name = "\improper SifGuard command uniform" - desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has gold trim and gold blazes." + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and gold blazes." icon_state = "blackutility_com" worn_state = "blackutility_com" @@ -222,13 +222,13 @@ /obj/item/clothing/under/mildress/expeditionary name = "\improper SifGuard dress uniform" - desc = "The dress uniform of the Sif Homeguard Corps in silver trim." + desc = "The dress uniform of the Sif Defense Force in silver trim." icon_state = "greydress" worn_state = "greydress" /obj/item/clothing/under/mildress/expeditionary/command name = "\improper SifGuard command dress uniform" - desc = "The dress uniform of the Sif Homeguard Corps in gold trim." + desc = "The dress uniform of the Sif Defense Force in gold trim." icon_state = "greydress_com" worn_state = "greydress_com" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a2b84e0a52..47da8c88f8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -98,6 +98,9 @@ /mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null, var/stun = 1) if(status_flags & GODMODE) return 0 //godmode + if(def_zone == "l_hand" || def_zone == "r_hand") //Diona (And any other potential plant people) hands don't get shocked. + if(species.flags & IS_PLANT) + return 0 shock_damage *= siemens_coeff if (shock_damage<1) return 0 diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index c21b070c46..82c90a71cb 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -243,7 +243,8 @@ // Replace completely missing limbs. for(var/limb_type in src.species.has_limbs) var/obj/item/organ/external/E = src.organs_by_name[limb_type] - E.disfigured = 0 + if(E && E.disfigured) + E.disfigured = 0 if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) E.removed() qdel(E) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 25062513bb..43ee891646 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -274,6 +274,9 @@ var/global/list/damage_icon_parts = list() if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" + robolimb_count++ + if(part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN) + robobody_count ++ else if(part.status & ORGAN_DEAD) icon_key += "3" else diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/modifiers.dm index 8e1f9e2f6f..f67ffc374b 100644 --- a/code/modules/mob/modifiers.dm +++ b/code/modules/mob/modifiers.dm @@ -7,6 +7,7 @@ var/desc = null // Ditto. var/icon_state = null // See above. var/mob/living/holder = null // The mob that this datum is affecting. + var/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel(). var/expire_at = null // world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else. var/on_created_text = null // Text to show to holder upon being created. var/on_expired_text = null // Text to show to holder when it expires. @@ -37,8 +38,12 @@ var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast. var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds. -/datum/modifier/New(var/new_holder) +/datum/modifier/New(var/new_holder, var/new_origin) holder = new_holder + if(new_origin) + origin = weakref(new_origin) + else // We assume the holder caused the modifier if not told otherwise. + origin = weakref(holder) ..() // Checks to see if this datum should continue existing. @@ -82,8 +87,9 @@ M.tick() // Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks. +// Third argument is the 'source' of the modifier, if it's from someone else. If null, it will default to the mob being applied to. // The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES) -/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null) +/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null) // First, check if the mob already has this modifier. for(var/datum/modifier/M in modifiers) if(istype(modifier_type, M)) @@ -99,7 +105,7 @@ return // If we're at this point, the mob doesn't already have it, or it does but stacking is allowed. - var/datum/modifier/mod = new modifier_type(src) + var/datum/modifier/mod = new modifier_type(src, origin) if(expire_at) mod.expire_at = world.time + expire_at if(mod.on_created_text) @@ -108,6 +114,8 @@ if(mod.mob_overlay_state) update_modifier_visuals() + return mod + // Removes a specific instance of modifier /mob/living/proc/remove_specific_modifier(var/datum/modifier/M, var/silent = FALSE) M.expire(silent) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index ba36fc6d68..8a6ef7624e 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -33,6 +33,8 @@ ui.add_template("mapContent", "crew_monitor_map_content.tmpl") // adding a template with the key "mapHeader" replaces the map header content ui.add_template("mapHeader", "crew_monitor_map_header.tmpl") + if(!(ui.map_z_level in data["map_levels"])) + ui.set_map_z_level(data["map_levels"][1]) ui.set_initial_data(data) ui.open() diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index ae55edeb00..8a259b6342 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -286,49 +286,43 @@ ///////// 5.56mm ///////// -/obj/item/ammo_magazine/a556 +/obj/item/ammo_magazine/c556 name = "magazine (5.56mm)" - icon_state = "5.56" + icon_state = "c5.56" origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = "a556" matter = list(DEFAULT_WALL_MATERIAL = 1800) ammo_type = /obj/item/ammo_casing/a556 - max_ammo = 10 - multiple_sprites = 1 - -/obj/item/ammo_magazine/a556/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/a556/practice - name = "magazine (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556p - -/obj/item/ammo_magazine/a556/ap - name = "magazine (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/a556m - name = "20rnd magazine (5.56mm)" - icon_state = "5.56mid" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a556" - matter = list(DEFAULT_WALL_MATERIAL = 3600) - ammo_type = /obj/item/ammo_casing/a556 max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/a556m/empty +/obj/item/ammo_magazine/c556/ext + name = "extended magazine (5.56mm)" + matter = list(DEFAULT_WALL_MATERIAL = 2700) + max_ammo = 30 + +/obj/item/ammo_magazine/c556/empty initial_ammo = 0 -/obj/item/ammo_magazine/a556m/ap - name = "20rnd magazine (5.56mm armor-piercing)" +/obj/item/ammo_magazine/c556/ext/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/c556/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/c556/practice/ext + name = "extended magazine (5.56mm practice)" + max_ammo = 30 + +/obj/item/ammo_magazine/c556/ap + name = "magazine (5.56mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a556/ap -/obj/item/ammo_magazine/a556m/practice - name = "20rnd magazine (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556p +/obj/item/ammo_magazine/c556/ap/ext + name = "extended magazine (5.56mm armor-piercing)" + max_ammo = 30 /obj/item/ammo_magazine/clip/a556 name = "ammo clip (5.56mm)" @@ -347,6 +341,25 @@ name = "rifle clip (5.56mm practice)" ammo_type = /obj/item/ammo_casing/a556 +/obj/item/ammo_magazine/a556 + name = "magazine box (5.56mm)" + icon_state = "a556" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "a556" + matter = list(DEFAULT_WALL_MATERIAL = 10000) + ammo_type = /obj/item/ammo_casing/a556 + w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! + max_ammo = 50 + multiple_sprites = 1 + +/obj/item/ammo_magazine/a556/ap + name = "magazine box (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/a556/empty + initial_ammo = 0 + ///////// .50 AE ///////// /obj/item/ammo_magazine/a50 @@ -375,33 +388,14 @@ ///////// 7.62mm ///////// -/obj/item/ammo_magazine/a762 - name = "magazine box (7.62mm)" - icon_state = "a762" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 10000) - ammo_type = /obj/item/ammo_casing/a762 - w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! - max_ammo = 50 - multiple_sprites = 1 - -/obj/item/ammo_magazine/a762/ap - name = "magazine box (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/a762/empty - initial_ammo = 0 - /obj/item/ammo_magazine/c762 name = "magazine (7.62mm)" - icon_state = "c762" + icon_state = "c7.62" mag_type = MAGAZINE caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 4000) + matter = list(DEFAULT_WALL_MATERIAL = 2000) ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 20 + max_ammo = 10 multiple_sprites = 1 /obj/item/ammo_magazine/c762/ap @@ -416,7 +410,7 @@ icon_state = "SVD" mag_type = MAGAZINE caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 2000) + matter = list(DEFAULT_WALL_MATERIAL = 1000) ammo_type = /obj/item/ammo_casing/a762 max_ammo = 10 multiple_sprites = 1 diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index add0170643..dfbd721952 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -257,6 +257,11 @@ icon_state = "rifle-casing" // Need to make an icon for these projectile_type = /obj/item/projectile/bullet/rifle/practice +/obj/item/ammo_casing/a556/blank + desc = "A blank 5.56mm bullet casing." + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + /obj/item/ammo_casing/a556/hp desc = "A 5.56mm hollow-point bullet casing." projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 0be77be543..bf30c19991 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -51,17 +51,17 @@ /obj/item/weapon/gun/projectile/automatic/sts35 name = "assault rifle" - desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. This one is unmarked." + desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 5.56mm rounds. This one is unmarked." icon_state = "arifle" item_state = null w_class = ITEMSIZE_LARGE force = 10 - caliber = "a762" + caliber = "a556" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c762 - allowed_magazines = list(/obj/item/ammo_magazine/c762, /obj/item/ammo_magazine/s762) + magazine_type = /obj/item/ammo_magazine/c556 + allowed_magazines = list(/obj/item/ammo_magazine/c556) one_handed_penalty = 4 @@ -104,19 +104,19 @@ /obj/item/weapon/gun/projectile/automatic/z8 name = "designated marksman rifle" - desc = "The Z8 Bulldog is an older model designated marksman rifle, made by the now defunct Zendai Foundries. Makes you feel like a space marine when you hold it, even though it can only hold 10 round magazines. Uses 5.56mm rounds and has an under barrel grenade launcher." + desc = "The Z8 Bulldog is an older model designated marksman rifle, made by the now defunct Zendai Foundries. Makes you feel like a space marine when you hold it, even though it can only hold 10 round magazines. Uses 7.62mm rounds and has an under barrel grenade launcher." icon_state = "carbine" // This isn't a carbine. :T item_state = "z8carbine" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a556" + caliber = "a762" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3) ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/Gunshot.ogg' slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a556 - allowed_magazines = list(/obj/item/ammo_magazine/a556) + magazine_type = /obj/item/ammo_magazine/c762 + allowed_magazines = list(/obj/item/ammo_magazine/c762) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -181,14 +181,14 @@ force = 10 slot_flags = 0 max_shells = 50 - caliber = "a762" + caliber = "a556" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2) slot_flags = SLOT_BACK - ammo_type = "/obj/item/ammo_casing/a762" // Is this really needed anymore? + ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/machinegun.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a762 - allowed_magazines = list(/obj/item/ammo_magazine/a762, /obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/a556 + allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/c556) one_handed_penalty = 6 @@ -346,16 +346,16 @@ /obj/item/weapon/gun/projectile/automatic/carbine name = "assault carbine" desc = "The bullpup configured GP3000 is a lightweight, compact, military-grade assault rifle produced by Gurov Projectile Weapons LLC. It is sold almost exclusively to standing armies. The serial number on this one has been scratched off. Uses 5.56mm rounds." - icon_state = "bullpupm" + icon_state = "bullpup" item_state = "bullpup" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a556" + caliber = "a762" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a556m - allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/a556m) + magazine_type = /obj/item/ammo_magazine/c762 + allowed_magazines = list(/obj/item/ammo_magazine/c762) one_handed_penalty = 4 @@ -366,9 +366,9 @@ /obj/item/weapon/gun/projectile/automatic/carbine/update_icon(var/ignore_inhands) ..() - if(istype(ammo_magazine,/obj/item/ammo_magazine/a556m)) - icon_state = "bullpupm" + if(ammo_magazine) + icon_state = "bullpup" else - icon_state = (ammo_magazine)? "bullpup" : "bullpup-empty" + icon_state = "bullpup-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" if(!ignore_inhands) update_held_icon() diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index e07c45294c..cbc403c4e0 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -19,7 +19,7 @@ /obj/item/weapon/gun/projectile/shotgun/pump/rifle/ceremonial name = "ceremonial bolt-action rifle" - desc = "A bolt-action rifle with a heavy, high-quality wood stock that has a beautiful finish. Clearly not intended to be used in combat. Uses 7.62mm rounds." + desc = "A bolt-action rifle with a heavy, high-quality wood stock that has a beautiful finish. Clearly not intended to be used in combat. Uses 5.56mm rounds." ammo_type = /obj/item/ammo_casing/a762/blank /obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin @@ -55,13 +55,13 @@ //Lever actions are the same thing, but bigger. /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever name = "lever-action rifle" - desc = "A reproduction of an almost ancient weapon design from the 19th century. This one uses a lever-action to move new rounds into the chamber. Uses 5.56mm rounds." + desc = "A reproduction of an almost ancient weapon design from the 19th century. This one uses a lever-action to move new rounds into the chamber. Uses 7.62mm rounds." item_state = "leveraction" icon_state = "leveraction" fire_sound = 'sound/weapons/rifleshot.ogg' max_shells = 5 - caliber = "a556" + caliber = "a762" origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech. - ammo_type = /obj/item/ammo_casing/a556 + ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER action_sound = 'sound/weapons/riflebolt.ogg' \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index cf62d9e0c8..c234242678 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -198,26 +198,26 @@ penetrating = 1 /obj/item/projectile/bullet/rifle/a762 - damage = 25 + damage = 35 /obj/item/projectile/bullet/rifle/a762/ap - damage = 20 - armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds. + damage = 30 + armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds. /obj/item/projectile/bullet/rifle/a762/hollow - damage = 35 + damage = 40 armor_penetration = -50 penetrating = 0 /obj/item/projectile/bullet/rifle/a556 - damage = 35 + damage = 25 /obj/item/projectile/bullet/rifle/a556/ap - damage = 30 - armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds. + damage = 20 + armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds. /obj/item/projectile/bullet/rifle/a556/hollow - damage = 40 + damage = 35 armor_penetration = -50 penetrating = 0 diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index 514e173896..43f89b4ec7 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -83,8 +83,8 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/clothing/accessory/storage/black_drop_pouches, /obj/item/weapon/storage/backpack/dufflebag/sec, /obj/item/weapon/gun/projectile/automatic/carbine, - /obj/item/ammo_magazine/a556m/ap, - /obj/item/ammo_magazine/a556m, + /obj/item/ammo_magazine/c762/ap, + /obj/item/ammo_magazine/c762, /obj/item/weapon/shield/energy, /obj/item/weapon/grenade/frag, /obj/item/weapon/grenade/frag, diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index df9c900d38..1ebd8207e0 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -249,7 +249,13 @@ env.merge(removed) for(var/mob/living/carbon/human/l in view(src, min(7, round(sqrt(power/6))))) // If they can see it without mesons on. Bad on them. - if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) + var/eye_shield = 0 //How protected they are + if(istype(l.glasses, /obj/item/clothing/glasses/meson)) + eye_shield += 1 + if(istype(l.head, /obj/item/clothing/head/helmet/space)) + if(l.run_armor_check(BP_HEAD, "rad") >= 60) + eye_shield += 1 + if(eye_shield < 1) l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) //adjusted range so that a power of 170 (pretty high) results in 9 tiles, roughly the distance from the core to the engine monitoring room. diff --git a/html/changelog.html b/html/changelog.html index 92b938a65a..e062e723b9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,41 @@ -->
+

09 May 2017

+

Anewbe updated:

+ +

Leshana updated:

+ +

N3X15 updated:

+ +

Neerti updated:

+ +

SiegDerMaus updated:

+ +

Yosh updated:

+ +

05 May 2017

Anewbe updated: