") + to_chat(user, examine_block( "No plant found.")) + to_chat(user, examine_block("\nWeed level: [weedlevel] / 10")) + to_chat(user, examine_block("\nPest level: [pestlevel] / 10")) + to_chat(user, examine_block("\nToxicity level: [toxic] / 100")) + to_chat(user, examine_block("\nWater level: [waterlevel] / [maxwater]")) + to_chat(user, examine_block("\nNutrition level: [reagents.total_volume] / [maxnutri]")) + to_chat(user, examine_block("
")) return else if(istype(O, /obj/item/cultivator)) diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index d4e87fd758e1..c1e73a823d10 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -72,19 +72,6 @@ Assistant //Shiptest outfits -/datum/outfit/job/assistant/solgov - name = "Sailor (SolGov)" - - uniform = /obj/item/clothing/under/solgov - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/beret/solgov/plain - -/datum/outfit/job/assistant/solgov/rebel - name = "Sailor (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - head = /obj/item/clothing/head/beret/solgov/terragov/plain - /datum/outfit/job/assistant/minutemen name = "Volunteer (Minutemen)" @@ -160,6 +147,36 @@ Assistant shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/safety_helmet +/datum/outfit/job/assistant/syndicate/sbc + name = "Deck Assistant (Twinkleshine)" + + uniform = /obj/item/clothing/under/syndicate/intern + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + ears = /obj/item/radio/headset/syndicate/alt + mask = /obj/item/clothing/mask/chameleon + r_pocket = /obj/item/kitchen/knife/combat/survival + back = /obj/item/storage/backpack + belt = /obj/item/storage/belt/military/assault + implants = list(/obj/item/implant/weapons_auth) + id = /obj/item/card/id/syndicate_command/crew_id + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/assistant/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 4)) // squidquest real + I.assignment = "Deck Assistant" + I.access |= list(ACCESS_SYNDICATE) + I.update_label() + /datum/outfit/job/assistant/independent/crewmatefancy name = "Crewmate (Independent)" @@ -235,3 +252,12 @@ Assistant l_pocket = /obj/item/kitchen/knife/combat/survival gloves = /obj/item/clothing/gloves/combat implants = list(/obj/item/implant/radio) + +/datum/outfit/job/assistant/frontiersmen + name = "Deckhand (frontiersmen)" + + uniform = /obj/item/clothing/under/rank/security/officer/frontier + shoes = /obj/item/clothing/shoes/jackboots + r_pocket = /obj/item/radio + head = /obj/item/clothing/head/beret/sec/frontier + ears = /obj/item/radio/headset/pirate diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 5b0e0b575e86..d5350deb179d 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -75,3 +75,12 @@ suit = /obj/item/clothing/suit/toggle/hazard head = /obj/item/clothing/head/hardhat id = /obj/item/card/id/syndicate_command/crew_id + +/datum/outfit/job/atmos/frontiersmen + name = "Atmospheric Technician (Frontiersmen)" + + uniform = /obj/item/clothing/under/rank/security/officer/frontier + suit = /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos + head = /obj/item/clothing/head/hardhat + ears = /obj/item/radio/headset/pirate + mask = /obj/item/clothing/mask/gas/atmos diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 58d59ed7ad61..c08a9bb262f8 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -37,6 +37,34 @@ W.registered_age = AGE_MINOR to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!") +/datum/outfit/job/bartender/syndicate/sbc + name = "Bartender (Twinkleshine)" + + uniform = /obj/item/clothing/under/syndicate/donk + shoes = /obj/item/clothing/shoes/laceup + gloves = /obj/item/clothing/gloves/color/white + ears = /obj/item/radio/headset/syndicate + mask = /obj/item/clothing/mask/chameleon + belt = /obj/item/storage/belt/bandolier + implants = list(/obj/item/implant/weapons_auth) + id = /obj/item/card/id/syndicate_command/crew_id + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/bartender/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(2, 5)) // squidquest real + I.assignment = "Bartender" + I.access |= list(ACCESS_SYNDICATE) + I.update_label() + /datum/outfit/job/bartender/pharma name = "Mixologist" diff --git a/code/modules/jobs/job_types/brig_physician.dm b/code/modules/jobs/job_types/brig_physician.dm index d854fb0214e4..3f13ed15ad59 100644 --- a/code/modules/jobs/job_types/brig_physician.dm +++ b/code/modules/jobs/job_types/brig_physician.dm @@ -50,3 +50,38 @@ suit = /obj/item/clothing/suit/toggle/labcoat/brig_phys l_pocket = /obj/item/reagent_containers/syringe alt_suit = null + +/datum/outfit/job/brig_phys/syndicate/sbc + name = "Medic (Twinkleshine)" + + gloves = /obj/item/clothing/gloves/color/latex/nitrile/evil + uniform = /obj/item/clothing/under/rank/medical/doctor/red + alt_uniform = /obj/item/clothing/under/syndicate/cybersun + glasses = /obj/item/clothing/glasses/hud/health + belt = /obj/item/storage/belt/medical + back = /obj/item/storage/backpack/duffelbag/syndie/med + shoes = /obj/item/clothing/shoes/combat + suit = /obj/item/clothing/suit/longcoat/roboblack + alt_suit = /obj/item/clothing/suit/toggle/labcoat + suit_store = null + ears = /obj/item/radio/headset/syndicate + mask = /obj/item/clothing/mask/chameleon + id = /obj/item/card/id/syndicate_command/crew_id/med + implants = list(/obj/item/implant/weapons_auth) + backpack_contents = list(/obj/item/pda/brig_phys) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie/med + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/brig_phys/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(6, 8)) // squidquest real + I.assignment = "Medic" + I.access |= list(ACCESS_SYNDICATE) + I.update_label() diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index e8750c09e995..d54b5bf4a338 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -62,17 +62,6 @@ shoes = /obj/item/clothing/shoes/laceup head = /obj/item/clothing/head/caphat/nt -/datum/outfit/job/captain/solgov - name = "Captain (SolGov)" - - ears = /obj/item/radio/headset/solgov/captain - shoes = /obj/item/clothing/shoes/laceup - suit = /obj/item/clothing/suit/toggle/solgov - -/datum/outfit/job/captain/solgov/rebel - name = "Captain (Deserter)" - suit = /obj/item/clothing/suit/toggle/solgov/terragov - /datum/outfit/job/captain/pirate name = "Captain (Pirate)" @@ -112,6 +101,39 @@ duffelbag = /obj/item/storage/backpack/duffelbag/sec courierbag = /obj/item/storage/backpack/messenger/sec +/datum/outfit/job/captain/syndicate/sbc + name = "Captain (Twinkleshine)" + + uniform = /obj/item/clothing/under/syndicate/aclf + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/combat + ears = /obj/item/radio/headset/syndicate/alt/captain + mask = /obj/item/clothing/mask/chameleon + l_pocket = /obj/item/melee/transforming/energy/sword/saber/red + suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate + suit_store = /obj/item/gun/ballistic/revolver/mateba + r_pocket = /obj/item/kitchen/knife/combat/survival + belt = /obj/item/storage/belt/military/assault + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch + id = /obj/item/card/id/syndicate_command/captain_id + implants = list(/obj/item/implant/weapons_auth) + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/pda/captain) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/captain/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(9, 12)) // squidquest real + I.access = get_all_accesses()+get_all_syndicate_access() + I.update_label() + /datum/outfit/job/captain/syndicate/gorlex name = "Captain (Gorlex Marauders)" @@ -219,3 +241,18 @@ l_pocket = /obj/item/kitchen/knife/combat implants = list(/obj/item/implant/radio) accessory = null + +/datum/outfit/job/captain/frontiersmen + name = "Captain (Frontiersmen)" + + ears = /obj/item/radio/headset/pirate/alt/captain + uniform = /obj/item/clothing/under/rank/security/officer/frontier/admiral + head = /obj/item/clothing/head/caphat/frontier/admiral + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq + mask = /obj/item/clothing/mask/gas/sechailer + suit = /obj/item/clothing/suit/armor/frontier + shoes = /obj/item/clothing/shoes/cowboy + gloves = /obj/item/clothing/gloves/combat + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch + + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/pda/captain) diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index cf7582b66b58..3f8c24c105be 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -42,19 +42,6 @@ //Shiptest outfits -/datum/outfit/job/cargo_tech/solgov - name = "Cargo Technician (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/cargo - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/beret/solgov/plain - -/datum/outfit/job/cargo_tech/solgov/pilot - name = "Pilot (SolGov)" - - suit = /obj/item/clothing/suit/jacket - /datum/outfit/job/cargo_tech/pilot name = "Pilot" @@ -84,3 +71,15 @@ /obj/item/export_scanner = 1, /obj/item/kitchen/knife/hunting = 1 ) + +/datum/outfit/job/cargo_tech/frontiersmen + name = "Cargo Tech (frontiersmen)" + + uniform = /obj/item/clothing/under/rank/security/officer/frontier + suit = /obj/item/clothing/suit/hazardvest + ears = /obj/item/radio/headset/pirate + shoes = /obj/item/clothing/shoes/workboots + head = /obj/item/clothing/head/soft + backpack_contents = list( + /obj/item/modular_computer/tablet/preset/cargo = 1, + ) diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 4daa1b9b6391..bb7dbfda1b0b 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -151,7 +151,7 @@ suit = /obj/item/clothing/suit/armor/hos/roumain/montagne head = /obj/item/clothing/head/HoS/cowboy/montagne gloves = null - id = /obj/item/card/id/captains_spare + id = /obj/item/card/id/gold duffelbag = /obj/item/storage/backpack/cultpack courierbag = /obj/item/storage/backpack/cultpack backpack_contents = list( diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index c8240524809d..98518c90b8be 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -119,3 +119,14 @@ belt = /obj/item/storage/belt/utility/full courierbag = /obj/item/storage/backpack/messenger/inteq + +/datum/outfit/job/ce/frontiersmen + name = "Head Carpenter (Frontiersmen)" + + ears = /obj/item/radio/headset/pirate + uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer + head = /obj/item/clothing/head/hardhat/white + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + belt = /obj/item/storage/belt/utility/full + diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 9cad4d1b5957..6f90a883267e 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -47,3 +47,13 @@ r_hand = /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy l_pocket = /obj/item/stack/sheet/mineral/coal //WS Edit End - Alt-Job Titles + +//shiptest outfits + +/datum/outfit/job/cook/frontiersmen + name = "Steward (frontiersmen)" + + uniform = /obj/item/clothing/under/rank/security/officer/frontier + ears = /obj/item/radio/headset/pirate + head = /obj/item/clothing/head/flatcap + suit = /obj/item/clothing/suit/apron/chef diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 1bf3797035e1..3f31936fa8a8 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -69,17 +69,6 @@ shoes = /obj/item/clothing/shoes/laceup head = /obj/item/clothing/head/hopcap/nt -/datum/outfit/job/head_of_personnel/solgov - name = "Executive Officer (SolGov)" - ears = /obj/item/radio/headset/solgov - uniform = /obj/item/clothing/under/rank/command/lieutenant - head = /obj/item/clothing/head/solgov - shoes = /obj/item/clothing/shoes/laceup - -/datum/outfit/job/head_of_personnel/solgov/rebel - name = "Executive Officer (Deserter)" - head = /obj/item/clothing/head/solgov/terragov - /datum/outfit/job/head_of_personnel/pirate name = "First Mate (Pirate)" ears = /obj/item/radio/headset/pirate @@ -136,3 +125,15 @@ id = /obj/item/card/id/syndicate_command/crew_id r_pocket = /obj/item/kitchen/knife/combat/survival glasses = /obj/item/clothing/glasses/sunglasses + +/datum/outfit/job/head_of_personnel/frontiersmen + name = "Bridge Officer (frontiersmen)" + + ears = /obj/item/radio/headset/pirate/alt + uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer + shoes = /obj/item/clothing/shoes/cowboy/black + head = /obj/item/clothing/head/beret/sec/frontier/officer + gloves = /obj/item/clothing/gloves/combat + r_pocket = /obj/item/kitchen/knife/combat/survival + glasses = /obj/item/clothing/glasses/sunglasses + suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c0bb1e0c7f76..71ee9987f779 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -85,3 +85,14 @@ alt_uniform = null head = /obj/item/clothing/head/beret/sec/hos +/datum/outfit/job/hos/frontiersmen + name = "Master At Arms (frontiersmen)" + + ears = /obj/item/radio/headset/syndicate/alt + uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer + head = /obj/item/clothing/head/caphat/frontier + suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier + shoes = /obj/item/clothing/shoes/cowboy/black + gloves = /obj/item/clothing/gloves/combat + backpack_contents = list(/obj/item/melee/baton/loaded=1) + suit_store = null diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index da2e2cba82a7..221c29482d7c 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -106,21 +106,6 @@ suit = null suit_store = null -/datum/outfit/job/doctor/solgov - name = "Medical Doctor (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/medblue - shoes = /obj/item/clothing/shoes/sneakers/white - head = /obj/item/clothing/head/beret/solgov - suit = /obj/item/clothing/suit/toggle/labcoat - -/datum/outfit/job/doctor/solgov/rebel - name = "Medical Doctor (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - head = /obj/item/clothing/head/beret/solgov/terragov - /datum/outfit/job/doctor/pirate name = "Ship's Doctor (Pirate)" @@ -166,3 +151,12 @@ duffelbag = /obj/item/storage/backpack/duffelbag courierbag = /obj/item/storage/backpack/messenger backpack_contents = list(/obj/item/storage/firstaid/roumain=1) + +/datum/outfit/job/doctor/frontiersmen + name = "Surgeon (frontiersmen)" + + uniform = /obj/item/clothing/under/rank/security/officer/frontier + glasses = /obj/item/clothing/glasses/hud/health/prescription + ears = /obj/item/radio/headset/pirate + r_pocket = /obj/item/kitchen/knife/combat/survival + backpack_contents = list(/obj/item/storage/firstaid/medical,) diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index d009af62ea69..3c39aa536fda 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -47,18 +47,6 @@ //Shiptest outfits -/datum/outfit/job/paramedic/solgov - name = "Combat Medic (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/medblue - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/beret/solgov - suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov/rep - ears = /obj/item/radio/headset/headset_medsec/alt - - backpack = /obj/item/storage/backpack/security - /datum/outfit/job/paramedic/traumateam name = "Paramedic (Trauma Team Technician)" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index ad994272d7f6..6be3acba924d 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -106,40 +106,6 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S //Shiptest outfits begin -/datum/outfit/job/security/solgov - name = "Boarding Specialist (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/helmet/solgov - suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov - -/datum/outfit/job/security/solgov/rebel - name = "Boarding Specialist (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - -/datum/outfit/job/security/solgov/elite - name = "Marine (SolGov)" - - uniform = /obj/item/clothing/under/solgov/elite - shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/tackler/combat - - backpack = /obj/item/storage/backpack/ert/security - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/gun_voucher/solgov=1) - -/datum/outfit/job/security/marine - name = "Marine (SolGov)" - - uniform = /obj/item/clothing/under/solgov/elite - shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/tackler/combat - - backpack = /obj/item/storage/backpack/ert/security - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/gun_voucher/solgov=1) - /datum/outfit/job/security/pirate name = "Buccaneer (Pirate)" @@ -271,6 +237,37 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S id = /obj/item/card/id/syndicate_command/crew_id backpack_contents = list(/obj/item/storage/box/survival/syndie=1) +/datum/outfit/job/security/syndicate/sbc + name = "Operative (Twinkleshine)" + uniform = /obj/item/clothing/under/syndicate/combat + ears = /obj/item/radio/headset/syndicate/alt + mask = /obj/item/clothing/mask/chameleon + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/combat + l_pocket = /obj/item/gun/ballistic/automatic/pistol + r_pocket = /obj/item/kitchen/knife/combat/survival + belt = /obj/item/storage/belt/military/assault + id = /obj/item/card/id/syndicate_command/crew_id + implants = list(/obj/item/implant/weapons_auth) + backpack_contents = list(/obj/item/gun_voucher/syndicate=1) + + head = null + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/security/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(4, 8)) // squidquest real + I.assignment = "Operative" + I.access |= list(ACCESS_SYNDICATE) + I.update_label() + /datum/outfit/job/security/aipirate name = "Nodesman (Security)" @@ -284,4 +281,20 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S implants = list(/obj/item/implant/radio) +/datum/outfit/job/security/Frontiersmen + name = "Buccaneer (Frontiersmen)" + + head = /obj/item/clothing/head/beret/sec/frontier + mask = /obj/item/clothing/mask/gas/sechailer/minutemen + suit = null + uniform = /obj/item/clothing/under/rank/security/officer/frontier + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + ears = /obj/item/radio/headset/pirate/alt + + belt = /obj/item/storage/belt/security/webbing + + l_pocket = /obj/item/flashlight/seclite + r_pocket = /obj/item/tank/internals/emergency_oxygen/double + //Shiptest outfits end diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 0189beaf4486..bf2236ff8fd6 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -44,19 +44,6 @@ gloves = /obj/item/clothing/gloves/color/black shoes = /obj/item/clothing/shoes/workboots -/datum/outfit/job/miner/solgov - name = "Pioneer (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/cargo - head = /obj/item/clothing/head/beret/solgov/plain - -/datum/outfit/job/miner/solgov/rebel - name = "Pioneer (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - head = /obj/item/clothing/head/beret/solgov/terragov/plain - /datum/outfit/job/miner/equipped name = "Shaft Miner (Equipment)" suit = /obj/item/clothing/suit/hooded/explorer @@ -93,19 +80,6 @@ alt_uniform = null alt_suit = /obj/item/clothing/suit/toggle/hazard -/datum/outfit/job/miner/solgov - name = "Field Engineer (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/cargo - head = /obj/item/clothing/head/hardhat/mining - suit = /obj/item/clothing/suit/hazardvest - -/datum/outfit/job/miner/solgov/rebel - name = "Field Engineer (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - /datum/outfit/job/miner/scientist name = "Minerologist" @@ -120,15 +94,35 @@ satchel = /obj/item/storage/backpack/satchel/tox courierbag = /obj/item/storage/backpack/messenger/tox -/datum/outfit/job/miner/syndicate - name = "Wrecker (Gorlex Marauders)" +/datum/outfit/job/miner/syndicate/sbc + name = "Miner (Twinkleshine)" - id = /obj/item/card/id/syndicate_command/crew_id - ears = /obj/item/radio/headset/syndicate/alt uniform = /obj/item/clothing/under/syndicate/gorlex - alt_uniform = null - accessory = /obj/item/clothing/accessory/armband/cargo - head = /obj/item/clothing/head/hardhat/orange + shoes = /obj/item/clothing/shoes/workboots + glasses = /obj/item/clothing/glasses/meson/night + gloves = /obj/item/clothing/gloves/explorer + ears = /obj/item/radio/headset/syndicate + mask = /obj/item/clothing/mask/chameleon + r_pocket = /obj/item/kitchen/knife/combat/survival + belt = /obj/item/storage/belt/mining/alt + implants = list(/obj/item/implant/weapons_auth) + id = /obj/item/card/id/syndicate_command/crew_id/engi + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/mining + +/datum/outfit/job/miner/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(5, 7)) // squidquest real + I.assignment = "Miner" + I.access |= list(ACCESS_SYNDICATE, ACCESS_ENGINE) + I.update_label() /datum/outfit/job/miner/old name = "Shaft Miner (Legacy)" diff --git a/code/modules/jobs/job_types/solgov_rep.dm b/code/modules/jobs/job_types/solgov_rep.dm index 853464102adc..afeb2eae4ce2 100644 --- a/code/modules/jobs/job_types/solgov_rep.dm +++ b/code/modules/jobs/job_types/solgov_rep.dm @@ -13,8 +13,6 @@ SolGov Representative exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SECURITY - outfit = /datum/outfit/job/solgov - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_HEADS, ACCESS_MAINT_TUNNELS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SOLGOV) @@ -22,39 +20,3 @@ SolGov Representative ACCESS_HEADS, ACCESS_MAINT_TUNNELS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SOLGOV) display_order = JOB_DISPLAY_ORDER_SOLGOV - -/datum/outfit/job/solgov - name = "SolGov Representative" - job_icon = "solgovrepresentative" - jobtype = /datum/job/solgov - - id = /obj/item/card/id/silver - head = /obj/item/clothing/head/solgov - uniform = /obj/item/clothing/under/solgov/formal - accessory = /obj/item/clothing/accessory/waistcoat/solgov - suit = /obj/item/clothing/suit/toggle/solgov - alt_suit = /obj/item/clothing/suit/armor/solgov_trenchcoat - dcoat = /obj/item/clothing/suit/hooded/wintercoat - gloves = /obj/item/clothing/gloves/color/white - shoes = /obj/item/clothing/shoes/laceup - ears = /obj/item/radio/headset/solgov - glasses = /obj/item/clothing/glasses/sunglasses - belt = /obj/item/pda/solgov - - implants = list(/obj/item/implant/mindshield) - - backpack = /obj/item/storage/backpack/captain - satchel = /obj/item/storage/backpack/satchel/cap - duffelbag = /obj/item/storage/backpack/duffelbag/captain - courierbag = /obj/item/storage/backpack/messenger/com - - backpack_contents = list( - /obj/item/kitchen/knife/letter_opener = 1 - ) - -/datum/outfit/job/solgov/rebel - name = "Signal Officer (Deserter)" - head = /obj/item/clothing/head/solgov/terragov - uniform = /obj/item/clothing/under/solgov/formal/terragov - accessory = /obj/item/clothing/accessory/waistcoat - suit = /obj/item/clothing/suit/toggle/solgov/terragov diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index b18ee74b37be..303187683e21 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -128,19 +128,6 @@ head = /obj/item/clothing/head/soft/inteq shoes = /obj/item/clothing/shoes/combat -/datum/outfit/job/engineer/solgov - name = "Ship Engineer (SolGov)" - - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband/engine - head = /obj/item/clothing/head/hardhat/orange - suit = /obj/item/clothing/suit/hazardvest - -/datum/outfit/job/engineer/solgov/rebel - name = "Ship Engineer (Deserter)" - - uniform = /obj/item/clothing/under/syndicate/camo - /datum/outfit/job/engineer/pirate name = "Ship's Engineer (Pirate)" @@ -173,6 +160,7 @@ accessory = /obj/item/clothing/accessory/armband/engine glasses = /obj/item/clothing/glasses/sunglasses shoes = /obj/item/clothing/shoes/jackboots + /datum/outfit/job/engineer/gec name = "Station Engineer (GEC)" @@ -190,6 +178,36 @@ alt_uniform = null glasses = null +/datum/outfit/job/engineer/syndicate/sbc + name = "Ship Engineer (Twinkleshine)" + + uniform = /obj/item/clothing/under/syndicate/gec + accessory = null + glasses = /obj/item/clothing/glasses/meson/night + head = /obj/item/clothing/head/hardhat/orange + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + ears = /obj/item/radio/headset/syndicate + mask = /obj/item/clothing/mask/chameleon + back = /obj/item/storage/backpack/industrial + belt = /obj/item/storage/belt/utility/syndicate + shoes = /obj/item/clothing/shoes/combat + suit = /obj/item/clothing/suit/hazardvest + alt_suit = /obj/item/clothing/suit/toggle/hazard + implants = list(/obj/item/implant/weapons_auth) + id = /obj/item/card/id/syndicate_command/crew_id/engi + backpack_contents = list(/obj/item/construction/rcd/combat, /obj/item/rcd_ammo/large) + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/engineer/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(6, 8)) // squidquest real + I.assignment = "Engineer" + I.access |= list(ACCESS_SYNDICATE) + I.update_label() + /datum/outfit/job/engineer/independent/ship_engineer name = "Ship Engineer (Independent)" @@ -226,3 +244,16 @@ gloves = /obj/item/clothing/gloves/combat implants = list(/obj/item/implant/radio) + +/datum/outfit/job/engineer/independent/frontiersmen + name = "Carpenter (frontiersmen)" + + belt = /obj/item/storage/belt/utility/full/engi + uniform = /obj/item/clothing/under/rank/security/officer/frontier + suit = /obj/item/clothing/suit/toggle/industrial + shoes = /obj/item/clothing/shoes/workboots + glasses = /obj/item/clothing/glasses/welding + head = /obj/item/clothing/head/helmet/space/pirate/bandana + + l_pocket = /obj/item/radio + r_pocket = /obj/item/analyzer diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index b30593044e22..2dd395e80ae3 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -32,8 +32,8 @@ uniform = /obj/item/clothing/under/rank/security/warden alt_uniform = /obj/item/clothing/under/rank/security/warden shoes = /obj/item/clothing/shoes/jackboots - alt_suit = /obj/item/clothing/suit/armor/vest/security/warden - suit = /obj/item/clothing/suit/armor/vest/security/warden/alt + alt_suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt + suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt dcoat = /obj/item/clothing/suit/hooded/wintercoat/security //WS Edit - Alt Uniforms gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/warden @@ -53,15 +53,6 @@ chameleon_extras = /obj/item/gun/ballistic/shotgun/automatic/combat/compact -/datum/outfit/job/warden/solgov - name = "Brig Officer (SolGov)" - - ears = /obj/item/radio/headset/solgov/alt - uniform = /obj/item/clothing/under/solgov - accessory = /obj/item/clothing/accessory/armband - head = /obj/item/clothing/head/beret/solgov - suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov/rep - /datum/outfit/job/warden/chiefmastersergeant name = "Chief Master Sergeant" r_pocket = /obj/item/gun/ballistic/automatic/pistol/solgov @@ -122,3 +113,35 @@ suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt alt_uniform = null alt_suit = null + +/datum/outfit/job/warden/syndicate/sbc + name = "Lieutenant (Twinkleshine)" + uniform = /obj/item/clothing/under/syndicate/aclf + head = /obj/item/clothing/head/HoS/beret/syndicate + ears = /obj/item/radio/headset/syndicate/alt/leader + mask = /obj/item/clothing/mask/chameleon + gloves = /obj/item/clothing/gloves/combat + l_pocket = /obj/item/gun/ballistic/automatic/pistol + r_pocket = /obj/item/kitchen/knife/combat/survival + belt = /obj/item/storage/belt/military/assault + shoes = /obj/item/clothing/shoes/combat + suit = /obj/item/clothing/suit/armor/vest + alt_suit = /obj/item/clothing/suit/aclf + id = /obj/item/card/id/syndicate_command/lieutenant + implants = list(/obj/item/implant/weapons_auth) + backpack_contents = list(/obj/item/melee/baton) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/syndie + courierbag = /obj/item/storage/backpack/messenger/sec + + box = /obj/item/storage/box/survival/syndie + +/datum/outfit/job/warden/syndicate/sbc/post_equip(mob/living/carbon/human/H) + H.faction |= list("PlayerSyndicate") + + var/obj/item/card/id/I = H.wear_id + I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(8, 10)) // squidquest real + I.access |= list(ACCESS_SYNDICATE) + I.update_label() diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index bcd2ee15b8f7..a3453127e20a 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -21,6 +21,7 @@ icon_keyboard = null circuit = /obj/item/circuitboard/computer/libraryconsole desc = "Checked out books MUST be returned on time." + unique_icon = TRUE var/screenstate = 0 var/title var/category = "Any" @@ -203,6 +204,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums icon_screen = "oldcomp_library" icon_keyboard = null circuit = /obj/item/circuitboard/computer/libraryconsole + unique_icon = TRUE var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 83a4c74fcb29..816866c84572 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -169,7 +169,6 @@ armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/pinpointer/deepcore) resistance_flags = FIRE_PROOF - slowdown = -0.3//finally, a reason for shiptesters to steal this supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/head/hooded/survivor_hood diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 52db94edb5d6..b4ba46715900 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -13,7 +13,7 @@ slot_flags = ITEM_SLOT_BACK throwforce = 5 throw_speed = 4 - armour_penetration = 10 + armour_penetration = 5 custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") @@ -27,8 +27,8 @@ var/list/trophies = list() var/charged = TRUE var/charge_time = 15 - var/detonation_damage = 25 - var/backstab_bonus = 30 + var/detonation_damage = 20 + var/backstab_bonus = 10 var/wielded = FALSE // track wielded status on item /obj/item/kinetic_crusher/Initialize() @@ -39,7 +39,7 @@ /obj/item/kinetic_crusher/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it - AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20) + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15) /obj/item/kinetic_crusher/Destroy() QDEL_LIST(trophies) @@ -730,6 +730,7 @@ desc = "During the early design process of the Kinetic Accelerator, a great deal of money and time was invested in magnetic distruption technology. \ Though eventually replaced with concussive blasts, the ever-practical NT designed a second mining tool. \ Only a few were ever produced, mostly for NT research institutions, and they are a valulable relic in the postwar age." + detonation_damage = 10 slowdown = 0.5//hevy attack_verb = list("mashed", "flattened", "bisected", "eradicated","destroyed") @@ -740,7 +741,7 @@ /obj/item/kinetic_crusher/old/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 60, 110) - AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=45)//big choppa! + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=25)//big choppa! /obj/item/kinetic_crusher/old/melee_attack_chain(mob/user, atom/target, params) ..() @@ -778,15 +779,15 @@ custom_price = 7500//a rare syndicate prototype. charged = TRUE charge_time = 15 - detonation_damage = 20 - backstab_bonus = 30 + detonation_damage = 35 + backstab_bonus = 15 wielded = FALSE // track wielded status on item actions_types = list() /obj/item/kinetic_crusher/syndie_crusher/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 60, 150) - AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=35) + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=10) /// triggered on wield of two handed item /obj/item/kinetic_crusher/syndie_crusher/on_wield(obj/item/source, mob/user) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index c982e6a62248..8194f93c50da 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -23,6 +23,7 @@ var/datum/techweb/stored_research var/obj/item/disk/design_disk/inserted_disk var/datum/component/remote_materials/materials + var/direction_to_edit = ORM_BOTH //ORM_INPUT is 1, ORM_OUTPUT is 2, any other value is ORM_BOTH (defaults to 0) (should only ever be either 0, 1, or 2, but won't completely break if something weird happens and it becomes >2 or <0) /obj/machinery/mineral/ore_redemption/Initialize(mapload) . = ..() @@ -49,7 +50,13 @@ if(in_range(user, src) || isobserver(user)) . += "The status display reads: Smelting [ore_multiplier] sheet(s) per piece of ore.
Reward point generation at [point_upgrade*100]%." if(panel_open) - . += "Alt-click to rotate the input and output direction." + if(direction_to_edit == ORM_INPUT) + . += "Alt-click to rotate the input direction." + else if (direction_to_edit == ORM_OUTPUT) + . += "Alt-click to rotate the output direction." + else //defaults to both + . += "Alt-click to rotate the input and output direction." + . += "Use a multitool to change the rotation mode." /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) if(QDELETED(O)) @@ -145,6 +152,19 @@ if(!powered()) return ..() + if(istype(W, /obj/item/multitool)) + if(panel_open) + direction_to_edit++ //toggles through whether alt+click will rotate input AND output, or either input OR output + if(direction_to_edit > ORM_OUTPUT) + direction_to_edit = ORM_BOTH + if(direction_to_edit == ORM_INPUT) + to_chat(user, "You change [src]'s I/O settings. you will now only change the input direction.") + else if(direction_to_edit == ORM_OUTPUT) + to_chat(user, "You change [src]'s I/O settings, you will now only change the output direction.") + else //defaults to both + to_chat(user, "You change [src]'s I/O settings, you will now change the input and output directions.") + return + if(istype(W, /obj/item/disk/design_disk)) if(user.transferItemToLoc(W, src)) inserted_disk = W @@ -163,9 +183,16 @@ if(!user.canUseTopic(src, BE_CLOSE)) return if(panel_open) - input_dir = turn(input_dir, -90) - output_dir = turn(output_dir, -90) - to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].") + if(direction_to_edit == ORM_INPUT) + input_dir = turn(input_dir, -90) + to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)].") + else if(direction_to_edit == ORM_OUTPUT) + output_dir = turn(output_dir, -90) + to_chat(user, "You change [src]'s I/O settings, setting the output to [dir2text(output_dir)].") + else //defaults to both + input_dir = turn(input_dir, -90) + output_dir = turn(output_dir, -90) + to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].") unregister_input_turf() // someone just rotated the input and output directions, unregister the old turf register_input_turf() // register the new one return TRUE diff --git a/code/modules/mob/dead/new_player/ship_select.dm b/code/modules/mob/dead/new_player/ship_select.dm index c4a29f001ab8..c3d7b500a590 100644 --- a/code/modules/mob/dead/new_player/ship_select.dm +++ b/code/modules/mob/dead/new_player/ship_select.dm @@ -64,6 +64,12 @@ if("buy") + if(is_banned_from(spawnee.ckey, "Ship Purchasing")) + to_chat(spawnee, "You are banned from purchasing ships!") + spawnee.new_player_panel() + ui.close() + return + ui.close() var/datum/map_template/shuttle/template = SSmapping.ship_purchase_list[params["name"]] if(!template.enabled) @@ -84,6 +90,7 @@ /datum/ship_select/ui_static_data(mob/user) . = list() .["ships"] = list() + .["purchaseBanned"] = is_banned_from(user.ckey, "Ship Purchasing") for(var/datum/overmap/ship/controlled/S as anything in SSovermap.controlled_ships) if(!S.is_join_option()) continue diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 7df8332bb309..37ffd23cc2ba 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -1797,6 +1797,30 @@ color_src = HAIR image_alpha = 150 +/datum/sprite_accessory/tails/human/fox + icon = 'icons/mob/species/misc/fox.dmi' + name = "Fox" + icon_state = "fox" + color_src = HAIR + +/datum/sprite_accessory/tails_animated/human/fox + icon = 'icons/mob/species/misc/fox.dmi' + name = "Fox" + icon_state = "fox" + color_src = HAIR + +/datum/sprite_accessory/tails/human/fox/alt + icon = 'icons/mob/species/misc/fox.dmi' + name = "Fox 2" + icon_state = "fox2" + color_src = HAIR + +/datum/sprite_accessory/tails_animated/human/fox/alt + icon = 'icons/mob/species/misc/fox.dmi' + name = "Fox 2" + icon_state = "fox2" + color_src = HAIR + /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' @@ -1863,6 +1887,13 @@ color_src = HAIR image_alpha = 150 +/datum/sprite_accessory/ears/fox + icon = 'icons/mob/species/misc/fox.dmi' + name = "Fox" + icon_state = "fox" + hasinner = 1 + color_src = HAIR + /datum/sprite_accessory/wings/none name = "None" icon_state = "none" @@ -2864,7 +2895,7 @@ name = "Ruffhawk" icon_state = "ruffhawk" -//Elzuosa help +//Elzuose help /datum/sprite_accessory/elzu_horns icon = 'icons/mob/ethereal_parts.dmi' diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 70173ca224f3..d9f05cfc1c42 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -134,16 +134,16 @@ //Gets blood from mob to a container or other mob, preserving all data in it. /mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) if(!blood_volume || !AM.reagents) - return 0 + return FALSE if(blood_volume < BLOOD_VOLUME_BAD && !forced) - return 0 + return FALSE if(blood_volume < amount) amount = blood_volume var/blood_id = get_blood_id() if(!blood_id) - return 0 + return FALSE blood_volume -= amount @@ -159,15 +159,17 @@ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) - if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) + + var/datum/blood_type/blood_type = blood_data["blood_type"] + if(!blood_type || !(blood_type.type in C.dna.blood_type.compatible_types)) C.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) - return 1 + return TRUE C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAX_LETHAL) - return 1 + return TRUE AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) - return 1 + return TRUE /mob/living/proc/get_blood_data(blood_id) @@ -235,27 +237,16 @@ return /datum/reagent/blood // This is has more potential uses, and is probably faster than the old proc. -/proc/get_safe_blood(bloodtype) - . = list() - if(!bloodtype) - return +/proc/random_blood_type() + return get_blood_type(pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")) + +/proc/get_blood_type(type) + return GLOB.blood_types[type] - var/static/list/bloodtypes_safe = list( - "A-" = list("A-", "O-"), - "A+" = list("A-", "A+", "O-", "O+"), - "B-" = list("B-", "O-"), - "B+" = list("B-", "B+", "O-", "O+"), - "AB-" = list("A-", "B-", "O-", "AB-"), - "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"), - "O-" = list("O-"), - "O+" = list("O-", "O+"), - "L" = list("L"), - "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U") - ) - - var/safe = bloodtypes_safe[bloodtype] - if(safe) - . = safe +/proc/get_blood_dna_color(list/blood_dna) + var/blood_print = blood_dna[length(blood_dna)] + var/datum/blood_type/blood_type = blood_dna[blood_print] + return blood_type.color //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) @@ -291,7 +282,7 @@ break if(!B) B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) - B.bloodiness = min((B.bloodiness + BLOOD_AMOUNT_PER_DECAL),MAX_SHOE_BLOODINESS) + B.bloodiness = min((B.bloodiness + BLOOD_AMOUNT_PER_DECAL), BLOOD_POOL_MAX) B.transfer_mob_blood_dna(src) //give blood info to the blood decal. if(temp_blood_DNA) B.add_blood_DNA(temp_blood_DNA) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 065fe00fdd7f..f638b5cd3166 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -135,6 +135,8 @@ var/turf/end_T = get_turf(target) if(start_T && end_T) log_combat(src, thrown_thing, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") + do_attack_animation(target, no_effect = 1) + playsound(loc, 'sound/weapons/punchmiss.ogg', 50, TRUE, -1) visible_message("[src] throws [thrown_thing].", \ "You throw [thrown_thing].") log_message("has thrown [thrown_thing]", LOG_ATTACK) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index c0d5b112d95f..7afe5068e276 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,7 +6,7 @@ var/t_has = p_have() var/t_is = p_are() - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!>") var/list/obscured = check_obscured_slots() if (handcuffed) @@ -139,6 +139,6 @@ if(151 to INFINITY) . += "[t_He] [t_is] covered in glistening dust!" //End WS edit - . += "*---------*" + . += "" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 2ef3e62f6ece..a30ecea4a2d0 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -17,13 +17,13 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) if(with_bodyparts) switch(dna.species.species_gibs) if("human") - new /obj/effect/gibspawner/human(get_turf(src), dna, get_static_viruses()) + new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) if("robotic") new /obj/effect/gibspawner/robot(get_turf(src)) else switch(dna.species.species_gibs) if("human") - new /obj/effect/gibspawner/human/bodypartless(get_turf(src), dna, get_static_viruses()) + new /obj/effect/gibspawner/human/bodypartless(get_turf(src), src, get_static_viruses()) if("robotic") new /obj/effect/gibspawner/robot/bodypartless(get_turf(src)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f6cc7c9ab806..21b98f07902f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -18,7 +18,7 @@ var/apparent_species if(dna?.species && !skipface) apparent_species = ", \an [dna.species.name]" - . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"][apparent_species]!") + . = list("This is [!obscure_name ? name : "Unknown"][apparent_species]!") //uniform if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ac3222dd6c04..9a3aee5e61f0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -24,6 +24,7 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, .proc/clean_face) AddComponent(/datum/component/personal_crafting) AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) + AddComponent(/datum/component/bloodysoles/feet) GLOB.human_list += src /mob/living/carbon/human/proc/setup_human_dna() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index fcdada744525..999161bd72dd 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -169,12 +169,11 @@ zone_hit_chance += 10 affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance)) var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target + if(affecting) if(I.force && I.damtype != STAMINA && (!IS_ORGANIC_LIMB(affecting))) // Bodpart_robotic sparks when hit, but only when it does real damage if(I.force >= 5) do_sparks(1, FALSE, loc) - if(prob(25)) - new /obj/effect/decal/cleanable/oil(loc) SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) @@ -184,7 +183,6 @@ // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) - /mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) @@ -717,8 +715,9 @@ return var/list/combined_msg = list() - visible_message("[src] examines [p_them()]self.", \ - "You check yourself for injuries.") + visible_message(span_notice("[src] examines [p_them()]self.")) + + combined_msg += span_notice("You check yourself for injuries.") var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) @@ -868,7 +867,7 @@ if(roundstart_quirks.len) combined_msg += "You have these quirks: [get_trait_string()]." - to_chat(src, combined_msg.Join("\n")) + to_chat(src, examine_block(combined_msg.Join("\n"))) /mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 5c5e89fdc179..77e2045e357c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -48,32 +48,9 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - - if(shoes) - if(body_position == STANDING_UP) - if(loc == NewLoc) - if(!has_gravity(loc)) - return - var/obj/item/clothing/shoes/S = shoes - - //Bloody footprints - var/turf/T = get_turf(src) - if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) - for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T) - if (oldFP.blood_state == S.blood_state) - return - //No oldFP or they're all a different kind of blood - S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) - if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD) - var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) - FP.blood_state = S.blood_state - FP.entered_dirs |= dir - FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD - FP.add_blood_DNA(S.return_blood_DNA()) - FP.update_icon() - update_inv_shoes() - //End bloody footprints - S.step_action() + if(shoes && (mobility_flags & MOBILITY_STAND) && loc == NewLoc && has_gravity(loc)) + var/obj/item/clothing/shoes/S = shoes + S.step_action() /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. if(dna.species.space_move(src)) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index ac02b57b8a23..0317631206bc 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -173,6 +173,10 @@ if(!not_handled) has_equipped(I, slot, initial) + // Send a signal for when we equip an item that used to cover our feet/shoes. Used for bloody feet + if((I.body_parts_covered & FEET) || (I.flags_inv | I.transparent_protection) & HIDESHOES) + SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_SHOECOVER, I, slot, initial, redraw_mob, swap) + return not_handled //For future deeper overrides /mob/living/carbon/human/equipped_speed_mods() @@ -262,6 +266,10 @@ if(!QDELETED(src)) update_inv_s_store() + // Send a signal for when we unequip an item that used to cover our feet/shoes. Used for bloody feet + if((I.body_parts_covered & FEET) || (I.flags_inv | I.transparent_protection) & HIDESHOES) + SEND_SIGNAL(src, COMSIG_CARBON_UNEQUIP_SHOECOVER, I, force, newloc, no_move, invdrop, silent) + /mob/living/carbon/human/wear_mask_update(obj/item/I, toggle_off = 1) if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(I.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) update_hair() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 75faf34f68d4..ca97f09aac8f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -47,8 +47,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) ///The gradient color used to color the gradient. var/grad_color ///The color used for the "white" of the eye, if the eye has one. - var/sclera_color = "e8e8e8" - + var/sclera_color = "#e8e8e8" + /// The color used for blush overlay + var/blush_color = COLOR_BLUSH_PINK ///Does the species use skintones or not? As of now only used by humans. var/use_skintones = FALSE ///If your race bleeds something other than bog standard blood, change this to reagent id. For example, ethereals bleed liquid electricity. @@ -158,6 +159,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) /// The maximum rate at which a species can cool down per tick var/bodytemp_heating_rate_max = HUMAN_BODYTEMP_HEATING_MAX + ///Does our species have colors for its' damage overlays? + var/use_damage_color = TRUE + ///Species-only traits. Can be found in [code/_DEFINES/DNA.dm] var/list/species_traits = list() ///Generic traits tied to having the species. @@ -445,7 +449,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) regenerate_organs(C,old_species) if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) - C.dna.blood_type = exotic_bloodtype + C.dna.blood_type = get_blood_type(exotic_bloodtype) if(old_species.mutanthands) for(var/obj/item/I in C.held_items) @@ -755,7 +759,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) // blush if (HAS_TRAIT(H, TRAIT_BLUSHING)) // Caused by either the *blush emote or the "drunk" mood event var/mutable_appearance/blush_overlay = mutable_appearance('icons/mob/human_face.dmi', "blush", -BODY_ADJ_LAYER) //should appear behind the eyes - blush_overlay.color = COLOR_BLUSH_PINK + if(H.dna && H.dna.species && H.dna.species.blush_color) + blush_overlay.color = H.dna.species.blush_color standing += blush_overlay // snore diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 65f5c725254a..c0e85d92b65c 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -2,12 +2,13 @@ name = "\improper Integrated Positronic Chassis" //inherited from the real species, for health scanners and things id = SPECIES_IPC sexes = FALSE - species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,NOBLOOD,TRAIT_EASYDISMEMBER,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH,NO_BONES, MUTCOLORS) //all of these + whatever we inherit from the real species + species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,TRAIT_EASYDISMEMBER,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH,NO_BONES) //all of these + whatever we inherit from the real species inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_LIMBATTACHMENT) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutantbrain = /obj/item/organ/brain/mmi_holder/posibrain mutanteyes = /obj/item/organ/eyes/robotic mutanttongue = /obj/item/organ/tongue/robot + mutantheart = /obj/item/organ/heart/cybernetic/ipc mutantliver = /obj/item/organ/liver/cybernetic/upgraded/ipc mutantstomach = /obj/item/organ/stomach/cell mutantears = /obj/item/organ/ears/robot @@ -18,7 +19,7 @@ default_features = list("mcolor" = "#7D7D7D", "ipc_screen" = "Static", "ipc_antenna" = "None", "ipc_chassis" = "Morpheus Cyberkinetics (Custom)", "ipc_brain" = "Posibrain", "body_size" = "Normal") meat = /obj/item/stack/sheet/plasteel{amount = 5} skinned_type = /obj/item/stack/sheet/metal{amount = 10} - exotic_blood = /datum/reagent/fuel/oil + exotic_bloodtype = "Coolant" damage_overlay_type = "synth" burnmod = 1.25 heatmod = 1.5 diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 1f2f1d70617d..1102d59ca2da 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -12,7 +12,7 @@ siemens_coeff = 0.5 //They thrive on energy brutemod = 1.25 //They're weak to punches attack_type = BURN //burn bish - exotic_blood = /datum/reagent/consumable/liquidelectricity + exotic_bloodtype = "E" damage_overlay_type = "" //We are too cool for regular damage overlays species_traits = list(DYNCOLORS, EYECOLOR, HAIR, FACEHAIR) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT @@ -252,7 +252,7 @@ H.visible_message("[H]'s EM frequency is scrambled to a random color.") else // select new color - var/new_etherealcolor = input(user, "Choose your elzuosa color:", "Character Preference",default_color) as color|null + var/new_etherealcolor = input(user, "Choose your Elzuose color:", "Character Preference",default_color) as color|null if(new_etherealcolor) var/temp_hsv = RGBtoHSV(new_etherealcolor) if(ReadHSV(temp_hsv)[3] >= ReadHSV("#505050")[3]) // elzu colors should be bright ok?? diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 8aee976ffbfb..d8ddad91aa29 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -15,6 +15,19 @@ /datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) if(C.dna.features["ears"] == "Cat") mutantears = /obj/item/organ/ears/cat + if(C.dna.features["ears"] == "Fox") + mutantears = /obj/item/organ/ears/fox if(C.dna.features["tail_human"] == "Cat") mutant_organs |= /obj/item/organ/tail/cat + if(C.dna.features["tail_human"] == "Fox") + mutant_organs |= /obj/item/organ/tail/fox return ..() + +/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) + if(H) + stop_wagging_tail(H) + +/datum/species/human/spec_stun(mob/living/carbon/human/H,amount) + if(H) + stop_wagging_tail(H) + . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 05736031fecf..94975e15e5b7 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -26,7 +26,8 @@ species_language_holder = /datum/language_holder/lizard digitigrade_customization = DIGITIGRADE_OPTIONAL mutanteyes = /obj/item/organ/eyes/lizard - sclera_color = "fffec4" + sclera_color = "#fffec4" + blush_color = COLOR_BLUSH_TEAL species_chest = /obj/item/bodypart/chest/lizard species_head = /obj/item/bodypart/head/lizard diff --git a/code/modules/mob/living/carbon/human/species_types/monkey.dm b/code/modules/mob/living/carbon/human/species_types/monkey.dm index 04e424f04f76..ade3d296b1db 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkey.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkey.dm @@ -5,6 +5,7 @@ id = SPECIES_MONKEY skinned_type = /obj/item/stack/sheet/animalhide/ changesource_flags = MIRROR_BADMIN + use_damage_color = FALSE species_chest = /obj/item/bodypart/chest/monkey species_head = /obj/item/bodypart/head/monkey diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index de8908bdd737..b530bf9e4791 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -184,17 +184,16 @@ There are several things that need to be remembered: inv.update_icon() //Bloody hands begin - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) - cut_overlay(bloody_overlay) if(!gloves && blood_in_hands && (num_hands > 0)) - bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) if(num_hands < 2) if(has_left_hand(FALSE)) bloody_overlay.icon_state = "bloodyhands_left" else if(has_right_hand(FALSE)) bloody_overlay.icon_state = "bloodyhands_right" + bloody_overlay.color = get_blood_dna_color(return_blood_DNA()) - add_overlay(bloody_overlay) + overlays_standing[GLOVES_LAYER] = bloody_overlay //Bloody hands end @@ -316,7 +315,7 @@ There are several things that need to be remembered: handled_by_bodytype = FALSE icon_file = DEFAULT_SHOES_PATH - shoes_overlay = I.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN) + shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN) if(!shoes_overlay) return @@ -737,6 +736,9 @@ generate/load female uniform sprites matching all previously decided variables if(L) standing.pixel_x += L["x"] //+= because of center()ing standing.pixel_y += L["y"] + //Handle worn offsets + else + standing.pixel_y += worn_y_offset standing.alpha = alpha standing.color = color diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 1359ccaaab53..1c7f480e0121 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -52,6 +52,7 @@ create_dna(src) dna.initialize_dna(random_blood_type()) AddComponent(/datum/component/footstep, FOOTSTEP_MOB_BAREFOOT, 1, -6) + AddComponent(/datum/component/bloodysoles/feet) /mob/living/carbon/monkey/Destroy() SSmobs.cubemonkeys -= src diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 8d73fe07efe5..d8242f175682 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -102,7 +102,10 @@ for(var/obj/item/bodypart/BP as anything in bodyparts) if(BP.dmg_overlay_type) if(BP.brutestate) - damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays + var/image/brute_overlay = image('icons/mob/dam_mob.dmi', "[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") + if(BP.use_damage_color) + brute_overlay.color = BP.damage_color + damage_overlay.add_overlay(brute_overlay) if(BP.burnstate) damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ef1f42673a78..2c2de521af67 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -787,10 +787,8 @@ /mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) if(!has_gravity()) return - var/blood_exists = FALSE + var/blood_exists = locate(/obj/effect/decal/cleanable/blood/trail_holder) in start - for(var/obj/effect/decal/cleanable/trail_holder/C in start) //checks for blood splatter already on the floor - blood_exists = TRUE if(isturf(start)) var/trail_type = getTrail() if(trail_type) @@ -807,9 +805,9 @@ if((newdir in GLOB.cardinals) && (prob(50))) newdir = turn(get_dir(target_turf, start), 180) if(!blood_exists) - new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses()) + new /obj/effect/decal/cleanable/blood/trail_holder(start, get_static_viruses()) - for(var/obj/effect/decal/cleanable/trail_holder/TH in start) + for(var/obj/effect/decal/cleanable/blood/trail_holder/TH in start) if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) TH.existing_dirs += newdir TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 26aadfd5168a..00e6810e60bc 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] [src]!") + . = list("This is [icon2html(src, user)] [src]!") if (stat == DEAD) . += "It appears to be powered-down." else @@ -14,9 +14,12 @@ else . += "Its casing is melted and heat-warped!" if(deployed_shell) - . += "The wireless networking light is blinking.\n" + . += "The wireless networking light is blinking." else if (!shunted && !client) - . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" - . += "*---------*" + . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..." + . += "" . += ..() + +/mob/living/silicon/ai/get_examine_string(mob/user, thats = FALSE) + return null diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 9121a1e4a977..d05061352dbf 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!") if(desc) . += "[desc]" @@ -43,6 +43,9 @@ . += "It doesn't seem to be responding." if(DEAD) . += "It looks like its system is corrupted and requires a reset." - . += "*---------*" + . += "" . += ..() + +/mob/living/silicon/robot/get_examine_string(mob/user, thats = FALSE) + return null diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e96960dabf26..82af2a7afdcd 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -279,7 +279,6 @@ "Kodiak - 'Polar'" = image(icon = 'icons/mob/robots.dmi', icon_state = "kodiak-standard"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-STD"), "R34 - STR4a 'Durin'" = image(icon = 'icons/mob/robots.dmi', icon_state = "durin"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-blue") ) default_icons = sortList(default_icons) var/default_borg_icon = show_radial_menu(R, R , default_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) @@ -320,10 +319,6 @@ cyborg_base_icon = "durin" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "durin" - if("Booty") - cyborg_base_icon = "booty-blue" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-blue" else return FALSE return ..() @@ -373,7 +368,6 @@ "Kodiak - 'Arachne'" = image(icon = 'icons/mob/robots.dmi', icon_state = "arachne"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-MED"), "R34 - MED6a 'Gibbs'" = image(icon = 'icons/mob/robots.dmi', icon_state = "gibbs"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-white"), "Qualified Doctor" = image(icon = 'icons/mob/robots.dmi', icon_state = "qualified_doctor") ) med_icons = sortList(med_icons) @@ -421,10 +415,6 @@ cyborg_base_icon = "gibbs" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "gibbs" - if("Booty") - cyborg_base_icon = "booty-white" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-white" if("Qualified Doctor") cyborg_base_icon = "qualified-doctor" cyborg_icon_override = 'icons/mob/robots.dmi' @@ -452,7 +442,7 @@ /obj/item/analyzer, /obj/item/geiger_counter/cyborg, /obj/item/assembly/signaler/cyborg, - /obj/item/areaeditor/blueprints/cyborg, + /obj/item/areaeditor/shuttle/cyborg, /obj/item/electroadaptive_pseudocircuit, /obj/item/stack/sheet/metal/cyborg, /obj/item/stack/sheet/glass/cyborg, @@ -483,7 +473,6 @@ "Kodiak" = image(icon = 'icons/mob/robots.dmi', icon_state = "kodiak-eng"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-ENG"), "R34 - ENG7a 'Conagher'" = image(icon = 'icons/mob/robots.dmi', icon_state = "conagher"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-yellow") ) engi_icons = sortList(engi_icons) var/engi_borg_icon = show_radial_menu(R, R , engi_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) @@ -530,10 +519,6 @@ cyborg_base_icon = "conagher" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "conagher" - if("Booty") - cyborg_base_icon = "booty-yellow" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-yellow" else return FALSE return ..() @@ -570,7 +555,6 @@ "Kodiak" = image(icon = 'icons/mob/robots.dmi', icon_state = "kodiak-sec"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-SEC"), "R34 - SEC10a 'Woody'" = image(icon = 'icons/mob/robots.dmi', icon_state = "woody"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-red") ) sec_icons = sortList(sec_icons) var/sec_borg_icon = show_radial_menu(R, R , sec_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) @@ -613,10 +597,6 @@ cyborg_base_icon = "woody" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "woody" - if("Booty") - cyborg_base_icon = "booty-red" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-red" else return FALSE return ..() @@ -699,7 +679,6 @@ "#29" = image(icon = 'icons/mob/robots.dmi', icon_state = "servbot-jani"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-JAN"), "R34 - CUS3a 'Flynn'" = image(icon = 'icons/mob/robots.dmi', icon_state = "flynn"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-green") ) jan_icons = sortList(jan_icons) var/jan_borg_icon = show_radial_menu(R, R , jan_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) @@ -742,10 +721,6 @@ cyborg_base_icon = "flynn" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "flynn" - if("Booty") - cyborg_base_icon = "booty-green" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-green" else return FALSE return ..() @@ -853,7 +828,6 @@ "Kodiak - 'Teddy'" = image(icon = 'icons/mob/robots.dmi', icon_state = "kodiak-service"), "Noble" = image(icon = 'icons/mob/robots.dmi', icon_state = "Noble-SRV"), "R34 - SRV9a 'Llyod'" = image(icon = 'icons/mob/robots.dmi', icon_state = "lloyd"), - "Booty" = image(icon = 'icons/mob/robots.dmi', icon_state = "booty-flower") ) service_icons = sortList(service_icons) var/service_robot_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) @@ -900,10 +874,6 @@ cyborg_base_icon = "lloyd" cyborg_icon_override = 'icons/mob/robots.dmi' special_light_key = "lloyd" - if("Booty") - cyborg_base_icon = "booty-flower" - cyborg_icon_override = 'icons/mob/robots.dmi' - special_light_key = "booty-flower" else return FALSE return ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 8e80536ffa5d..6ef4c9a67f27 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -337,18 +337,6 @@ usr << browse(list, "window=laws") -/mob/living/silicon/proc/ai_roster() - if(!client) - return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) - /mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). if(!radio) to_chat(src, "Radio not detected.") diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index d0cb5c5b6549..c3cfd7fdd76e 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -295,7 +295,6 @@ if(blood) target_types += /obj/effect/decal/cleanable/xenoblood target_types += /obj/effect/decal/cleanable/blood - target_types += /obj/effect/decal/cleanable/trail_holder if(pests) target_types += /mob/living/simple_animal/hostile/cockroach diff --git a/code/modules/mob/living/simple_animal/bot/hygienebot.dm b/code/modules/mob/living/simple_animal/bot/hygienebot.dm index 0ad29b3f3308..cd05106f934e 100644 --- a/code/modules/mob/living/simple_animal/bot/hygienebot.dm +++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm @@ -242,6 +242,5 @@ Maintenance panel is [open ? "opened" : "closed"]"} A.wash(CLEAN_WASH) - /obj/machinery/bot_core/hygienebot req_one_access = list(ACCESS_JANITOR, ACCESS_ROBOTICS) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 96457b4111e3..778cd3ff4910 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -76,13 +76,13 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]") + . = list("This is [icon2html(src, user)] \a [src]!\n[desc]") if(health < maxHealth) if(health >= maxHealth/2) . += "[t_He] look[t_s] slightly dented." else . += "[t_He] look[t_s] severely dented!" - . += "*---------*" + . += "" /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) if(isconstruct(M)) //is it a construct? diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 1b73a3b211f6..b99d1f5dddf1 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -221,46 +221,21 @@ id = /obj/item/card/id glasses = /obj/item/clothing/glasses/hud/health -/obj/effect/mob_spawn/human/corpse/solgov/infantry - name = "SolGov Infantryman" - id_job = "SolGov Infantryman" - outfit = /datum/outfit/solgov/infantrymancorpse +/obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner + name = "SolGov Sonnensoldner" + id_job = "SolGov Sonnensoldner" + outfit = /datum/outfit/solgov/sonnensoldner id_access_list = list(ACCESS_SOLGOV) - hairstyle = "Buzzcut" - facial_hairstyle = "Shaved" -/datum/outfit/solgov/infantrymancorpse - name = "SGV Infantry Corpse" +/datum/outfit/solgov/sonnensoldner + name = "SolGov Sonnensoldner" uniform = /obj/item/clothing/under/solgov suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov shoes = /obj/item/clothing/shoes/jackboots gloves = /obj/item/clothing/gloves/color/grey ears = /obj/item/radio/headset suit_store = null - mask = /obj/item/clothing/mask/gas/sechailer/swat - head = /obj/item/clothing/head/helmet/solgov + head = /obj/item/clothing/head/solgov/sonnensoldner back = /obj/item/storage/backpack id = /obj/item/card/id/solgov backpack_contents = null - -/obj/effect/mob_spawn/human/corpse/solgov/officer - name = "SolGov Officer" - id_job = "SolGov Officer" - outfit = /datum/outfit/solgov/officercorpse - id_access_list = list(ACCESS_SOLGOV) - hairstyle = "Buzzcut" - facial_hairstyle = "Shaved" - -/datum/outfit/solgov/officercorpse - name = "SGV Officer Corpse" - uniform = /obj/item/clothing/under/solgov - suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - ears = /obj/item/radio/headset/solgov/alt - suit_store = null - mask = /obj/item/clothing/mask/gas/sechailer/swat - head = /obj/item/clothing/head/helmet/solgov - back = /obj/item/storage/backpack - id = /obj/item/card/id/solgov/commander - backpack_contents = null diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index a1e23efe5fa0..6b638ac53c72 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -191,7 +191,7 @@ dust() /mob/living/simple_animal/drone/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!") //Hands for(var/obj/item/I in held_items) @@ -227,7 +227,7 @@ . += "A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\"." else . += "A message repeatedly flashes on its display: \"ERROR -- OFFLINE\"." - . += "*---------*" + . += "" /mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 7e1a1cd94f58..e29029ff694d 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -348,6 +348,94 @@ else STOP_PROCESSING(SSobj, src) +//junglefowl +/mob/living/simple_animal/hostile/retaliate/chicken + name = "\improper junglefowl" + desc = "A small, fierce, feathered beast." + gender = FEMALE + mob_biotypes = MOB_ORGANIC|MOB_BEAST + icon_state = "chicken_brown" + icon_living = "chicken_brown" + icon_dead = "chicken_brown_dead" + speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.") + speak_emote = list("clucks","croons") + emote_hear = list("clucks.") + emote_see = list("pecks at the ground.","flaps its wings viciously.") + density = FALSE + speak_chance = 2 + turns_per_move = 3 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/chicken = 2) + var/egg_type = /obj/item/reagent_containers/food/snacks/egg + food_type = list(/obj/item/reagent_containers/food/snacks/grown/wheat) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "scratches" + response_harm_simple = "scratch" + attack_verb_continuous = "scratches" + attack_verb_simple = "scratch" + health = 25 + maxHealth = 25 + var/eggsleft = 0 + var/eggsFertile = TRUE + var/body_color + var/icon_prefix = "chicken" + pass_flags = PASSTABLE + mob_size = MOB_SIZE_SMALL + var/list/feedMessages = list("It clucks happily.","It clucks happily.") + var/list/layMessage = EGG_LAYING_MESSAGES + var/list/validColors = list("brown","black","white") + gold_core_spawnable = FRIENDLY_SPAWN + var/static/chicken_count = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + melee_damage_lower = 3 + melee_damage_upper = 10 + + footstep_type = FOOTSTEP_MOB_CLAW + +/mob/living/simple_animal/hostile/retaliate/chicken/Initialize() + . = ..() + if(!body_color) + body_color = pick(validColors) + icon_state = "[icon_prefix]_[body_color]" + icon_living = "[icon_prefix]_[body_color]" + icon_dead = "[icon_prefix]_[body_color]_dead" + pixel_x = rand(-6, 6) + pixel_y = rand(0, 10) + ++chicken_count + +/mob/living/simple_animal/hostile/retaliate/chicken/Destroy() + --chicken_count + return ..() + +/mob/living/simple_animal/hostile/retaliate/chicken/attackby(obj/item/O, mob/user, params) + if(is_type_in_list(O, food_type)) + if(!stat && eggsleft < 8) + var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]" + user.visible_message(feedmsg) + qdel(O) + eggsleft += rand(1, 4) + else + to_chat(user, "[name] doesn't seem hungry!") + else + ..() + +/mob/living/simple_animal/hostile/retaliate/chicken/Life() + . =..() + if(!.) + return + if((!stat && prob(3) && eggsleft > 0) && egg_type) + visible_message("[src] [pick(layMessage)]") + eggsleft-- + var/obj/item/E = new egg_type(get_turf(src)) + E.pixel_x = E.base_pixel_x + rand(-6,6) + E.pixel_y = E.base_pixel_y + rand(-6,6) + if(eggsFertile) + if(chicken_count < MAX_CHICKENS && prob(25)) + START_PROCESSING(SSobj, E) + + /mob/living/simple_animal/deer name = "doe" desc = "A gentle, peaceful forest animal. How did this get into space?" @@ -378,3 +466,4 @@ blood_volume = BLOOD_VOLUME_NORMAL food_type = list(/obj/item/reagent_containers/food/snacks/grown/apple) footstep_type = FOOTSTEP_MOB_SHOE + diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index e294720e239b..48fb3db7b7bd 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -19,13 +19,13 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - . = list("*---------*\nThis is [icon2html(src)] \a [src]!\n[desc]") + . = list("This is [icon2html(src)] \a [src]!\n[desc]") for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage." - . += "*---------*" + . += "" else return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 4816006885ce..9afea9921ef6 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -23,7 +23,7 @@ maxHealth = 60 health = 60 speed = 0 - + mob_size = MOB_SIZE_LARGE obj_damage = 60 melee_damage_lower = 20 melee_damage_upper = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index f8aa4a1b5ab8..8dbd15b64640 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -53,6 +53,7 @@ gold_core_spawnable = HOSTILE_SPAWN lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE footstep_type = FOOTSTEP_MOB_CLAW + mob_size = MOB_SIZE_LARGE var/playable_spider = FALSE var/datum/action/innate/spider/lay_web/lay_web var/directive = "" //Message passed down to children, to relay the creator's orders @@ -195,15 +196,14 @@ icon_state = "tarantula" icon_living = "tarantula" icon_dead = "tarantula_dead" - maxHealth = 225 // woah nelly - health = 225 + maxHealth = 150 // woah nelly + health = 150 melee_damage_lower = 25 melee_damage_upper = 35 poison_per_bite = 0 move_to_delay = 8 - speed = 7 + speed = 9 status_flags = NONE - mob_size = MOB_SIZE_LARGE gold_core_spawnable = NO_SPAWN var/slowed_by_webs = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index f264f4b78cff..6e12ba91e903 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -407,8 +407,6 @@ Difficulty: Medium new /obj/effect/mob_spawn/human/lost/assistant(get_turf(loc)) if(6) new /obj/effect/mob_spawn/human/lost/syndicate(get_turf(loc)) - if(7) - new /obj/effect/mob_spawn/human/lost/solgov(get_turf(loc)) qdel(src) //no spawning people twice diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index fe84ad3766d5..1611ef0d5c3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -116,7 +116,9 @@ attack_same = TRUE // So we'll attack watchers butcher_results = list(/obj/item/stack/sheet/sinew = 4, /obj/item/stack/sheet/bone = 2) lava_drinker = FALSE - var/shell_health = 50 + maxHealth = 40 + health = 40 + var/shell_health = 80 //Tough to crack, easy to kill. var/has_shell = TRUE var/list/shell_loot = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/diamond) var/shell_snap_message = FALSE @@ -159,6 +161,7 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands/bullet_act(obj/projectile/P) shell_damage(BULLET_SHELL_DAMAGE) if(has_shell) + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 85, TRUE) visible_message("The [P] is absorbed by the [src]'s shell, dealing minimal damage!") //make it less confusing when bullets do no damage return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm index d8599a233509..45d4114da6e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm @@ -28,7 +28,7 @@ attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' //attack_vis_effect = ATTACK_EFFECT_BITE - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 2, /obj/effect/decal/cleanable/brimdust = 1) + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/effect/decal/cleanable/brimdust = 1) loot = list() robust_searching = TRUE footstep_type = FOOTSTEP_MOB_CLAW diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 6aba967d9626..f17070695381 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -20,9 +20,9 @@ speak_emote = list("bellows") speed = 3 throw_deflection = 10 - maxHealth = 200 - health = 200 - armor = list("melee" = 30, "bullet" = 15, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 10) + maxHealth = 80 + health = 80 + armor = list("melee" = 40, "bullet" = 40, "laser" = 25, "energy" = 10, "bomb" = 50, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 10) //Thick carapace, weak to AP ammo. harm_intent_damage = 0 obj_damage = 100 melee_damage_lower = 12 @@ -246,8 +246,8 @@ icon_living = "ancient_goliath" icon_aggro = "ancient_goliath_alert" icon_dead = "ancient_goliath_dead" - maxHealth = 350 - health = 350 + maxHealth = 180 + health = 180 speed = 4 crusher_loot = /obj/item/crusher_trophy/elder_tentacle pre_attack_icon = "ancient_goliath_preattack" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index f2dc05afe251..9079b21de0f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -327,6 +327,61 @@ .=..() AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril), 200, faction, "peels itself off from", 3) +// Snow Legion +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow + name = "snow legion" + desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion" + icon_living = "snowlegion" + icon_aggro = "snowlegion_alive" + icon_dead = "snowlegion" + crusher_loot = /obj/item/crusher_trophy/legion_skull + loot = list(/obj/item/organ/regenerative_core/legion) + brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow + +// Snow Legion skull +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow + name = "snow legion" + desc = "One of many." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion_head" + icon_living = "snowlegion_head" + icon_aggro = "snowlegion_head" + icon_dead = "snowlegion_head" + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril + fromtendril = TRUE + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal + name = "disfigured legion" + desc = "Disfigured, contorted, and corrupted. This thing was once part of the legion, now it has a different vile and twisted allegiance." + icon_state = "disfigured_legion" + icon_living = "disfigured_legion" + icon_aggro = "disfigured_legion" + icon_dead = "disfigured_legion" + difficulty = 2 + brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal + loot = list(/obj/item/organ/regenerative_core/legion/crystal) + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal + name = "disfigured legion" + desc = "One of none." + icon_state = "disfigured_legion_head" + icon_living = "disfigured_legion_head" + icon_aggro = "disfigured_legion_head" + icon_dead = "disfigured_legion_head" + speed = 3 + move_to_delay = 3 + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal/death(gibbed) + for(var/i in 0 to 5) + var/obj/projectile/P = new /obj/projectile/goliath(get_turf(src)) + P.preparePixelProjectile(get_step(src, pick(GLOB.alldirs)), get_turf(src)) + P.firer = source + P.fire(i*(360/5)) + return ..() + //Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into lava or fell into chasms. /obj/effect/mob_spawn/human/corpse/charredskeleton name = "charred skeletal remains" @@ -344,21 +399,51 @@ H.set_species(/datum/species/dwarf) H.transform = H.transform.Scale(0.8, 1)//somehow dwarf squashing is borked when not roundstart. I hate WS code -/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() - var/type = pickweight(list("Miner" = 51, "Waldo" = 3, "Ashwalker" = 7, "Soldier" = 3, "Oldminer" = 7, "Kobold" = 5, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4)) +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() //in an ideal world, these would generate, the legion would overlay over the corpse, and we'd get cool sprites + mob_species = pickweight(list( + /datum/species/human = 31, + /datum/species/lizard = 26, + /datum/species/ethereal = 24, + /datum/species/spider = 7, + /datum/species/ipc = 7, + /datum/species/jelly = 4, + /datum/species/fly = 1 + ) + ) + var/type = pickweight(list( + "Miner" = 54, + "Waldo" = 3, + "Ashwalker" = 7, + "Soldier" = 3, + "Oldminer" = 8, + "Kobold" = 5, + "Golem" = 6, + pick("Shadow", "YeOlde", "Operative", "Cultist") = 4 + ) + ) switch(type) if("Miner") - mob_species = pickweight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2)) - if(mob_species == /datum/species/plasmaman) + if(prob(2)) + mob_species = /datum/species/plasmaman uniform = /obj/item/clothing/under/plasmaman head = /obj/item/clothing/head/helmet/space/plasmaman belt = /obj/item/tank/internals/plasmaman/belt else uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland if (prob(4)) - belt = pickweight(list(/obj/item/storage/belt/mining = 2, /obj/item/storage/belt/mining/alt = 2)) + belt = pickweight(list( + /obj/item/storage/belt/mining = 2, + /obj/item/storage/belt/mining/alt = 2 + ) + ) else if(prob(10)) - belt = pickweight(list(/obj/item/pickaxe = 8, /obj/item/pickaxe/mini = 4, /obj/item/pickaxe/silver = 2, /obj/item/pickaxe/diamond = 1)) + belt = pickweight(list( + /obj/item/pickaxe = 8, + /obj/item/pickaxe/mini = 4, + /obj/item/pickaxe/silver = 2, + /obj/item/pickaxe/diamond = 1 + ) + ) else belt = /obj/item/tank/internals/emergency_oxygen/engi if(mob_species != /datum/species/lizard) @@ -368,22 +453,95 @@ if(prob(45)) glasses = /obj/item/clothing/glasses/meson if(prob(20)) - suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/cloak/goliath = 2)) + suit = pickweight(list( + /obj/item/clothing/suit/hooded/explorer = 18, + /obj/item/clothing/suit/hooded/cloak/goliath = 2 + ) + ) if(prob(30)) - r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/spacecash/bundle/mediumrand = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1)) + r_pocket = pickweight(list( + /obj/item/stack/marker_beacon = 20, + /obj/item/spacecash/bundle/mediumrand = 7, + /obj/item/reagent_containers/hypospray/medipen/survival = 2, + /obj/item/borg/upgrade/modkit/damage = 1 + ) + ) if(prob(10)) - l_pocket = pickweight(list(/obj/item/spacecash/bundle/mediumrand = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1)) + l_pocket = pickweight(list( + /obj/item/spacecash/bundle/mediumrand = 7, + /obj/item/reagent_containers/hypospray/medipen/survival = 2, + /obj/item/borg/upgrade/modkit/cooldown = 1 + ) + ) if(prob(95)) back = /obj/item/storage/backpack/explorer - backpack_contents = list() + backpack_contents = list(/obj/item/radio) if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite=3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite = 3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite = 3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(30)) - backpack_contents += list(/obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list(1 = 3, 2 = 2, 3 = 1))) + backpack_contents += list( + /obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list( + 1 = 3, + 2 = 2, + 3 = 1 + ) + ) + ) if(prob(30)) backpack_contents += /obj/item/gun/energy/kinetic_accelerator else @@ -399,16 +557,74 @@ gloves = /obj/item/clothing/gloves/explorer/old uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland/old if(prob(85)) - back = /obj/item/storage/backpack/explorer + back = /obj/item/storage/backpack/explorer //someone could totally make these backpacks a subtype and just have them be there. It'd cut down this file size a bit. backpack_contents = list() if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite=3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite=3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(70)) - backpack_contents += pick(list(/obj/item/borg/upgrade/modkit/damage = 1, /obj/item/borg/upgrade/modkit/trigger_guard = 1, /obj/item/soap/nanotrasen = 1, /obj/item/wormhole_jaunter = 1, /obj/item/fulton_core = 1, /obj/item/extraction_pack = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 3, /obj/item/hivelordstabilizer = 2, /obj/item/stack/marker_beacon/ten = 2, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 2, /obj/item/kitchen/knife/combat/survival = 3, /obj/item/flashlight/seclite=3, /obj/item/stack/sheet/sinew = 3, /obj/item/stack/sheet/bone = 3)) + backpack_contents += pickweight(list( + /obj/item/borg/upgrade/modkit/damage = 1, + /obj/item/borg/upgrade/modkit/trigger_guard = 1, + /obj/item/soap/nanotrasen = 1, + /obj/item/wormhole_jaunter = 1, + /obj/item/fulton_core = 1, + /obj/item/extraction_pack = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 3, + /obj/item/hivelordstabilizer = 2, + /obj/item/stack/marker_beacon/ten = 2, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 2, + /obj/item/kitchen/knife/combat/survival = 3, + /obj/item/flashlight/seclite=3, + /obj/item/stack/sheet/sinew = 3, + /obj/item/stack/sheet/bone = 3 + ) + ) if(prob(30)) - backpack_contents += list(/obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list(1 = 3, 2 = 2, 3 = 1))) + backpack_contents += list( + /obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list( + 1 = 3, + 2 = 2, + 3 = 1 + ) + ) + ) if(prob(30)) backpack_contents += /obj/item/gun/energy/kinetic_accelerator/old else @@ -416,9 +632,20 @@ if(prob(30)) belt = /obj/item/storage/belt/mining/alt if(prob(30)) - r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/spacecash/bundle/mediumrand = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1)) + r_pocket = pickweight(list( + /obj/item/stack/marker_beacon = 20, + /obj/item/spacecash/bundle/mediumrand = 7, + /obj/item/reagent_containers/hypospray/medipen/survival = 2, + /obj/item/borg/upgrade/modkit/damage = 1 + ) + ) if(prob(30)) - l_pocket = pickweight(list(/obj/item/spacecash/bundle/mediumrand = 5, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1)) + l_pocket = pickweight(list( + /obj/item/spacecash/bundle/mediumrand = 5, + /obj/item/reagent_containers/hypospray/medipen/survival = 2, + /obj/item/borg/upgrade/modkit/cooldown = 1 + ) + ) if("Ashwalker") mob_species = /datum/species/lizard/ashwalker uniform = /obj/item/clothing/under/costume/gladiator/ash_walker @@ -429,7 +656,11 @@ suit = /obj/item/clothing/suit/armor/bone gloves = /obj/item/clothing/gloves/bracer if(prob(45)) - back = pickweight(list(/obj/item/spear/bonespear = 3, /obj/item/fireaxe/boneaxe = 2)) + back = pickweight(list( + /obj/item/spear/bonespear = 3, + /obj/item/fireaxe/boneaxe = 2 + ) + ) if(prob(10)) belt = /obj/item/storage/belt/mining/primitive if(prob(30)) @@ -442,36 +673,111 @@ uniform = /obj/item/clothing/under/solgov suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov shoes = /obj/item/clothing/shoes/jackboots - gloves = /obj/item/clothing/gloves/color/grey + gloves = /obj/item/clothing/gloves/color/black mask = /obj/item/clothing/mask/gas/sechailer - head = /obj/item/clothing/head/helmet/solgov + head = /obj/item/clothing/head/solgov/sonnensoldner id = /obj/item/card/id/solgov else - uniform = /obj/item/clothing/under/solgov/elite + uniform = /obj/item/clothing/under/solgov suit = /obj/item/clothing/suit/space/hardsuit/solgov shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat mask = /obj/item/clothing/mask/gas/sechailer/swat - id = /obj/item/card/id/solgov/elite + id = /obj/item/card/id/solgov if(prob(85)) back = /obj/item/storage/backpack backpack_contents = list() if(prob(75)) - backpack_contents += pick(list(/obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, /obj/item/storage/firstaid/tactical = 1, /obj/item/gun/ballistic/automatic/pistol/solgov = 1, /obj/item/gps = 1, /obj/item/stock_parts/cell/gun/upgraded = 2, /obj/item/ammo_box/magazine/pistol556mm = 3, /obj/item/desk_flag/solgov = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/detective_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/kitchen/knife/combat = 3, /obj/item/flashlight/seclite=3, /obj/item/ammo_casing/shotgun = 3, /obj/item/binoculars = 3, /obj/item/clipboard = 3)) + backpack_contents += pickweight(list( + /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, + /obj/item/storage/firstaid/tactical = 1, + /obj/item/gun/ballistic/automatic/pistol/solgov = 1, + /obj/item/gps = 1, + /obj/item/stock_parts/cell/gun/upgraded = 2, + /obj/item/ammo_box/magazine/pistol556mm = 3, + /obj/item/desk_flag/solgov = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/detective_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/kitchen/knife/combat = 3, + /obj/item/flashlight/seclite=3, + /obj/item/ammo_casing/shotgun = 3, + /obj/item/binoculars = 3, + /obj/item/clipboard = 3 + ) + ) if(prob(75)) - backpack_contents += pick(list(/obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, /obj/item/storage/firstaid/tactical = 1, /obj/item/gun/ballistic/automatic/pistol/solgov = 1, /obj/item/gps = 1, /obj/item/stock_parts/cell/gun/upgraded = 2, /obj/item/ammo_box/magazine/pistol556mm = 3, /obj/item/desk_flag/solgov = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/detective_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/kitchen/knife/combat = 3, /obj/item/flashlight/seclite=3, /obj/item/ammo_casing/shotgun = 3, /obj/item/binoculars = 3, /obj/item/clipboard = 3)) + backpack_contents += pickweight(list( + /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, + /obj/item/storage/firstaid/tactical = 1, + /obj/item/gun/ballistic/automatic/pistol/solgov = 1, + /obj/item/gps = 1, + /obj/item/stock_parts/cell/gun/upgraded = 2, + /obj/item/ammo_box/magazine/pistol556mm = 3, + /obj/item/desk_flag/solgov = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/detective_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/kitchen/knife/combat = 3, + /obj/item/flashlight/seclite=3, + /obj/item/ammo_casing/shotgun = 3, + /obj/item/binoculars = 3, + /obj/item/clipboard = 3 + ) + ) if(prob(75)) - backpack_contents += pick(list(/obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, /obj/item/storage/firstaid/tactical = 1, /obj/item/gun/ballistic/automatic/pistol/solgov = 1, /obj/item/gps = 1, /obj/item/stock_parts/cell/gun/upgraded = 2, /obj/item/ammo_box/magazine/pistol556mm = 3, /obj/item/desk_flag/solgov = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/detective_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/kitchen/knife/combat = 3, /obj/item/flashlight/seclite=3, /obj/item/ammo_casing/shotgun = 3, /obj/item/binoculars = 3, /obj/item/clipboard = 3)) + backpack_contents += pickweight(list( + /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1, + /obj/item/storage/firstaid/tactical = 1, + /obj/item/gun/ballistic/automatic/pistol/solgov = 1, + /obj/item/gps = 1, + /obj/item/stock_parts/cell/gun/upgraded = 2, + /obj/item/ammo_box/magazine/pistol556mm = 3, + /obj/item/desk_flag/solgov = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/detective_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/kitchen/knife/combat = 3, + /obj/item/flashlight/seclite=3, + /obj/item/ammo_casing/shotgun = 3, + /obj/item/binoculars = 3, + /obj/item/clipboard = 3 + ) + ) else - back = pickweight(list(/obj/item/gun/ballistic/shotgun/automatic = 5, /obj/item/gun/ballistic/rocketlauncher/unrestricted = 5)) + back = pickweight(list( + /obj/item/gun/ballistic/shotgun/automatic = 5, + /obj/item/gun/ballistic/rocketlauncher/unrestricted = 5 + ) + ) if(prob(25)) belt = /obj/item/storage/belt/military if(prob(50)) - r_pocket = pickweight(list(/obj/item/reagent_containers/hypospray/medipen/stimpack = 1, /obj/item/kitchen/knife/letter_opener = 3, /obj/item/radio/off = 3, /obj/item/grenade/syndieminibomb/concussion = 1, /obj/item/melee/transforming/energy/ctf/solgov = 1)) + r_pocket = pickweight(list( + /obj/item/reagent_containers/hypospray/medipen/stimpack = 1, + /obj/item/kitchen/knife/letter_opener = 3, + /obj/item/radio/off = 3, + /obj/item/grenade/syndieminibomb/concussion = 1, + /obj/item/melee/transforming/energy/ctf/solgov = 1 + ) + ) if(prob(50)) - l_pocket = pickweight(list(/obj/item/reagent_containers/hypospray/medipen/stimpack = 1, /obj/item/kitchen/knife/letter_opener = 3, /obj/item/radio/off = 3, /obj/item/grenade/syndieminibomb/concussion = 1, /obj/item/melee/transforming/energy/ctf/solgov = 1)) + l_pocket = pickweight(list( + /obj/item/reagent_containers/hypospray/medipen/stimpack = 1, + /obj/item/kitchen/knife/letter_opener = 3, + /obj/item/radio/off = 3, + /obj/item/grenade/syndieminibomb/concussion = 1, + /obj/item/melee/transforming/energy/ctf/solgov = 1 + ) + ) if(prob(70)) - glasses = pickweight(list(/obj/item/clothing/glasses/sunglasses = 3, /obj/item/clothing/glasses/hud/health = 3, /obj/item/clothing/glasses/hud/health/night = 1, /obj/item/clothing/glasses/night = 2)) + glasses = pickweight(list( + /obj/item/clothing/glasses/sunglasses = 3, + /obj/item/clothing/glasses/hud/health = 3, + /obj/item/clothing/glasses/hud/health/night = 1, + /obj/item/clothing/glasses/night = 2 + ) + ) if("Kobold") mob_species = /datum/species/lizard/ashwalker/kobold uniform = /obj/item/clothing/under/costume/gladiator/ash_walker @@ -482,51 +788,130 @@ suit = /obj/item/clothing/suit/armor/bone gloves = /obj/item/clothing/gloves/bracer if(prob(5)) - back = pickweight(list(/obj/item/spear/bonespear = 3, /obj/item/fireaxe/boneaxe = 2)) + back = pickweight(list( + /obj/item/spear/bonespear = 3, + /obj/item/fireaxe/boneaxe = 2 + ) + ) if(prob(10)) belt = /obj/item/storage/belt/mining/primitive if(prob(30)) r_pocket = /obj/item/kitchen/knife/combat/bone if(prob(30)) l_pocket = /obj/item/kitchen/knife/combat/bone - if("Clown") - name = pick(GLOB.clown_names) - outfit = /datum/outfit/job/clown - belt = null - backpack_contents = list() - if(prob(70)) - backpack_contents += pick(list(/obj/item/stamp/clown = 1, /obj/item/reagent_containers/spray/waterflower = 1, /obj/item/reagent_containers/food/snacks/grown/banana = 1, /obj/item/megaphone/clown = 1, /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, /obj/item/pneumatic_cannon/pie = 1)) - if(prob(30)) - backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pickweight(list(1 = 3, 2 = 2, 3 = 1))) - if(prob(10)) - l_pocket = pickweight(list(/obj/item/bikehorn/golden = 3, /obj/item/bikehorn/airhorn= 1)) - if(prob(10)) - r_pocket = /obj/item/implanter/sad_trombone if("Golem") - mob_species = pick(list(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium)) + mob_species = pickweight(list( + /datum/species/golem/adamantine = 5, + /datum/species/golem/plasma = 10, + /datum/species/golem/diamond = 10, + /datum/species/golem/gold = 10, + /datum/species/golem/silver = 10, + /datum/species/golem/plasteel = 10, + /datum/species/golem/titanium = 10, + /datum/species/golem/plastitanium = 10 + ) + ) if(prob(70)) back = /obj/item/storage/backpack backpack_contents = list() if(prob(75)) - backpack_contents += pick(list(/obj/item/slime_extract/grey = 1, /obj/item/slime_scanner = 1, /obj/item/resonator/upgraded = 1, /obj/item/gps = 1, /obj/item/fulton_core = 2, /obj/item/extraction_pack = 3, /obj/item/stack/sheet/mineral/plasma/twenty = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/flashlight/seclite=3, /obj/item/research_notes/loot/medium = 3, /obj/item/stack/sheet/metal/fifty = 3, /obj/item/research_notes/loot/big = 1)) + backpack_contents += pickweight(list( + /obj/item/slime_extract/grey = 1, + /obj/item/slime_scanner = 1, + /obj/item/resonator/upgraded = 1, + /obj/item/gps = 1, + /obj/item/fulton_core = 2, + /obj/item/extraction_pack = 3, + /obj/item/stack/sheet/mineral/plasma/twenty = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/flashlight/seclite=3, + /obj/item/research_notes/loot/medium = 3, + /obj/item/stack/sheet/metal/fifty = 3, + /obj/item/research_notes/loot/big = 1 + ) + ) if(prob(75)) - backpack_contents += pick(list(/obj/item/slime_extract/grey = 1, /obj/item/slime_scanner = 1, /obj/item/resonator/upgraded = 1, /obj/item/gps = 1, /obj/item/fulton_core = 2, /obj/item/extraction_pack = 3, /obj/item/stack/sheet/mineral/plasma/twenty = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/flashlight/seclite=3, /obj/item/research_notes/loot/medium = 3, /obj/item/stack/sheet/metal/fifty = 3, /obj/item/research_notes/loot/big = 1)) + backpack_contents += pickweight(list( + /obj/item/slime_extract/grey = 1, + /obj/item/slime_scanner = 1, + /obj/item/resonator/upgraded = 1, + /obj/item/gps = 1, + /obj/item/fulton_core = 2, + /obj/item/extraction_pack = 3, + /obj/item/stack/sheet/mineral/plasma/twenty = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/flashlight/seclite=3, + /obj/item/research_notes/loot/medium = 3, + /obj/item/stack/sheet/metal/fifty = 3, + /obj/item/research_notes/loot/big = 1 + ) + ) if(prob(75)) - backpack_contents += pick(list(/obj/item/slime_extract/grey = 1, /obj/item/slime_scanner = 1, /obj/item/resonator/upgraded = 1, /obj/item/gps = 1, /obj/item/fulton_core = 2, /obj/item/extraction_pack = 3, /obj/item/stack/sheet/mineral/plasma/twenty = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/mining_scanner = 2, /obj/item/extinguisher/mini = 3, /obj/item/flashlight/seclite=3, /obj/item/research_notes/loot/medium = 3, /obj/item/stack/sheet/metal/fifty = 3, /obj/item/research_notes/loot/big = 1)) - if(prob(5)) - backpack_contents += list(/obj/item/storage/box/rndboards) + backpack_contents += pickweight(list( + /obj/item/slime_extract/grey = 1, + /obj/item/slime_scanner = 1, + /obj/item/resonator/upgraded = 1, + /obj/item/gps = 1, + /obj/item/fulton_core = 2, + /obj/item/extraction_pack = 3, + /obj/item/stack/sheet/mineral/plasma/twenty = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/mining_scanner = 2, + /obj/item/extinguisher/mini = 3, + /obj/item/flashlight/seclite=3, + /obj/item/research_notes/loot/medium = 3, + /obj/item/stack/sheet/metal/fifty = 3, + /obj/item/research_notes/loot/big = 1 + ) + ) + if(prob(3)) + backpack_contents += list( + /obj/item/storage/box/rndboards + ) if(prob(20)) - backpack_contents += pick(list(/obj/item/storage/box/stockparts/basic = 4, /obj/item/storage/box/stockparts/t2 = 3, /obj/item/storage/box/stockparts/t3 = 2, /obj/item/storage/box/stockparts/deluxe = 1)) + backpack_contents += pickweight(list( + /obj/item/storage/box/stockparts/basic = 4, + /obj/item/storage/box/stockparts/t2 = 3, + /obj/item/storage/box/stockparts/t3 = 2, + /obj/item/storage/box/stockparts/deluxe = 1 + ) + ) if(prob(30)) - glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2, /obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1)) + glasses = pickweight(list( + /obj/item/clothing/glasses/meson = 2, + /obj/item/clothing/glasses/hud/health = 2, + /obj/item/clothing/glasses/hud/diagnostic =2, + /obj/item/clothing/glasses/science = 2, + /obj/item/clothing/glasses/welding = 2, + /obj/item/clothing/glasses/night = 1 + ) + ) if(prob(10)) - belt = pick(list(/obj/item/storage/belt/mining/vendor, /obj/item/storage/belt/utility/full)) + belt = pickweight(list( + /obj/item/storage/belt/mining/vendor, + /obj/item/storage/belt/utility/full + ) + ) if(prob(50)) neck = /obj/item/bedsheet/rd/royal_cape if(prob(10)) - l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/screwdriver/power, /obj/item/weldingtool/experimental)) + l_pocket = pickweight(list( + /obj/item/crowbar/power, + /obj/item/screwdriver/power, + /obj/item/weldingtool/experimental + ) + ) if(prob(10)) - r_pocket = pick(list(/obj/item/crowbar/power, /obj/item/screwdriver/power, /obj/item/weldingtool/experimental)) + r_pocket = pickweight(list( + /obj/item/crowbar/power, + /obj/item/screwdriver/power, + /obj/item/weldingtool/experimental + ) + ) if("YeOlde") mob_gender = FEMALE uniform = /obj/item/clothing/under/costume/maid @@ -555,15 +940,63 @@ back = /obj/item/storage/backpack/satchel/leather backpack_contents = list() if(prob(50)) - backpack_contents += pick(list(/obj/item/book/granter/spell/knock = 1, /obj/item/book/granter/spell/blind = 1, /obj/item/shadowcloak = 1, /obj/item/book/granter/spell/smoke = 2, /obj/item/reagent_containers/syringe/mulligan = 2, /obj/item/dice/d20/fate/stealth/one_use = 1, /obj/item/clothing/head/chameleon/broken = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/grenade/smokebomb = 3, /obj/item/grenade/flashbang = 3)) + backpack_contents += pickweight(list( + /obj/item/book/granter/spell/knock = 1, + /obj/item/book/granter/spell/blind = 1, + /obj/item/shadowcloak = 1, + /obj/item/book/granter/spell/smoke = 2, + /obj/item/reagent_containers/syringe/mulligan = 2, + /obj/item/dice/d20 = 3, + /obj/item/dice/d20/fate/stealth/one_use = 1, + /obj/item/clothing/head/chameleon/broken = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/grenade/smokebomb = 3, + /obj/item/grenade/flashbang = 3 + ) + ) if(prob(50)) - backpack_contents += pick(list(/obj/item/book/granter/spell/knock = 1, /obj/item/book/granter/spell/blind = 1, /obj/item/shadowcloak = 1, /obj/item/book/granter/spell/smoke = 2, /obj/item/reagent_containers/syringe/mulligan = 2, /obj/item/dice/d20/fate/stealth/one_use = 1, /obj/item/clothing/head/chameleon/broken = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/grenade/smokebomb = 3, /obj/item/grenade/flashbang = 3)) + backpack_contents += pickweight(list( + /obj/item/book/granter/spell/knock = 1, + /obj/item/book/granter/spell/blind = 1, + /obj/item/shadowcloak = 1, + /obj/item/book/granter/spell/smoke = 2, + /obj/item/reagent_containers/syringe/mulligan = 2, + /obj/item/dice/d20/fate/stealth/one_use = 1, + /obj/item/dice/d20 = 3, + /obj/item/clothing/head/chameleon/broken = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/grenade/smokebomb = 3, + /obj/item/grenade/flashbang = 3 + ) + ) if(prob(50)) - backpack_contents += pick(list(/obj/item/book/granter/spell/knock = 1, /obj/item/book/granter/spell/blind = 1, /obj/item/shadowcloak = 1, /obj/item/book/granter/spell/smoke = 2, /obj/item/reagent_containers/syringe/mulligan = 2, /obj/item/dice/d20/fate/stealth/one_use = 1, /obj/item/clothing/head/chameleon/broken = 3, /obj/item/stack/marker_beacon/ten = 3, /obj/item/grenade/smokebomb = 3, /obj/item/grenade/flashbang = 3)) + backpack_contents += pickweight(list( + /obj/item/book/granter/spell/knock = 1, + /obj/item/book/granter/spell/blind = 1, + /obj/item/shadowcloak = 1, + /obj/item/book/granter/spell/smoke = 2, + /obj/item/reagent_containers/syringe/mulligan = 2, + /obj/item/dice/d20/fate/stealth/one_use = 1, + /obj/item/clothing/head/chameleon/broken = 3, + /obj/item/stack/marker_beacon/ten = 3, + /obj/item/grenade/smokebomb = 3, + /obj/item/grenade/flashbang = 3 + ) + ) if(prob(25)) - r_pocket = pick(list(/obj/item/chameleon, /obj/item/dnainjector/chameleonmut = 1, /obj/item/flashlight/flashdark = 1)) + r_pocket = pickweight(list( + /obj/item/chameleon, + /obj/item/dnainjector/chameleonmut = 1, + /obj/item/flashlight/flashdark = 1 + ) + ) if(prob(25)) - l_pocket = pick(list(/obj/item/chameleon, /obj/item/dnainjector/chameleonmut = 1, /obj/item/flashlight/flashdark = 1)) + l_pocket = pickweight(list( + /obj/item/chameleon, + /obj/item/dnainjector/chameleonmut = 1, + /obj/item/flashlight/flashdark = 1 + ) + ) if("Shadow") mob_species = /datum/species/shadow r_pocket = /obj/item/reagent_containers/pill/shadowtoxin @@ -582,60 +1015,10 @@ l_pocket = /obj/item/melee/cultblade/dagger glasses = /obj/item/clothing/glasses/hud/health/night/cultblind back = /obj/item/storage/backpack/cultpack - backpack_contents = list(/obj/item/reagent_containers/glass/beaker/unholywater = 1, /obj/item/cult_shift = 1, /obj/item/flashlight/flare/culttorch = 1, /obj/item/stack/sheet/runed_metal = 15) + backpack_contents = list( + /obj/item/reagent_containers/glass/beaker/unholywater = 1, + /obj/item/cult_shift = 1, + /obj/item/flashlight/flare/culttorch = 1, + /obj/item/stack/sheet/runed_metal = 15 + ) . = ..() - -// Snow Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow - name = "snow legion" - desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion" - icon_living = "snowlegion" - icon_aggro = "snowlegion_alive" - icon_dead = "snowlegion" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - -// Snow Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - name = "snow legion" - desc = "One of many." - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion_head" - icon_living = "snowlegion_head" - icon_aggro = "snowlegion_head" - icon_dead = "snowlegion_head" - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril - fromtendril = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal - name = "disfigured legion" - desc = "Disfigured, contorted, and corrupted. This thing was once part of the legion, now it has a different vile and twisted allegiance." - icon_state = "disfigured_legion" - icon_living = "disfigured_legion" - icon_aggro = "disfigured_legion" - icon_dead = "disfigured_legion" - difficulty = 2 - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal - loot = list(/obj/item/organ/regenerative_core/legion/crystal) - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal - name = "disfigured legion" - desc = "One of none." - icon_state = "disfigured_legion_head" - icon_living = "disfigured_legion_head" - icon_aggro = "disfigured_legion_head" - icon_dead = "disfigured_legion_head" - speed = 3 - move_to_delay = 3 - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal/death(gibbed) - for(var/i in 0 to 5) - var/obj/projectile/P = new /obj/projectile/goliath(get_turf(src)) - P.preparePixelProjectile(get_step(src, pick(GLOB.alldirs)), get_turf(src)) - P.firer = source - P.fire(i*(360/5)) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm index 51b7536caf7b..9f458f617c87 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm @@ -18,8 +18,9 @@ ranged_cooldown_time = 30 minimum_distance = 4 retreat_distance = 3 - maxHealth = 150 - health = 150 + maxHealth = 80 + health = 80 + armor = list("melee" = 20, "bullet" = 20, "laser" = 10, "energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 10) obj_damage = 40 melee_damage_lower = 15 melee_damage_upper = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm index 0148f7c2d6dd..ceef301b2349 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm @@ -14,8 +14,9 @@ move_to_delay = 20 ranged = TRUE ranged_cooldown_time = 200 - maxHealth = 300 - health = 300 + maxHealth = 80 + health = 80 + armor = list("melee" = 40, "bullet" = 40, "laser" = 25, "energy" = 10, "bomb" = 50, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 10) obj_damage = 15 melee_damage_lower = 20 melee_damage_upper = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm index 9f394fbe68e2..f9d15892f75d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm @@ -12,8 +12,9 @@ speak_emote = list("growls") speed = 12 move_to_delay = 12 - maxHealth = 200 - health = 200 + maxHealth = 100 + health = 100 + armor = list("melee" = 20, "bullet" = 20, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 10) obj_damage = 40 melee_damage_lower = 25 melee_damage_upper = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index c2983fabc6a8..f1674611d43a 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -135,7 +135,7 @@ /mob/living/simple_animal/hostile/netherworld/migo/Initialize() . = ..() - migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/runtime/hyperspace/hyperspace_begin.ogg', 'sound/runtime/hyperspace/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gun/pistol/shot_suppressed.ogg', 'sound/weapons/gun/pistol/shot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers + migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/runtime/hyperspace/hyperspace_begin.ogg', 'sound/runtime/hyperspace/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gun/pistol/shot_suppressed.ogg', 'sound/weapons/gun/pistol/shot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlocks/standard/open.ogg', 'sound/machines/creaking.ogg', 'sound/machines/airlocks/standard/close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers /mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index be4934cab127..c43c37a6bd21 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -109,7 +109,7 @@ if(istype(target, /turf/closed/wall)) var/turf/closed/wall/thewall = target to_chat(src, "You begin tearing through the wall...") - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + playsound(src, 'sound/machines/creaking.ogg', 100, TRUE) var/timetotear = 40 if(istype(target, /turf/closed/wall/r_wall)) timetotear = 120 diff --git a/code/modules/mob/living/simple_animal/hostile/survivors.dm b/code/modules/mob/living/simple_animal/hostile/survivors.dm index 12c46c966f1a..c0601050c54c 100644 --- a/code/modules/mob/living/simple_animal/hostile/survivors.dm +++ b/code/modules/mob/living/simple_animal/hostile/survivors.dm @@ -25,19 +25,9 @@ attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM unsuitable_atmos_damage = 15 - speak_emote = list( - "The sun... The sun...", - "You'll do...", - "All mine...", - "Gg..free..", - "Drink.. need drink...", - "I can smell... you..", - "G-g...", - "Taste..the salt.", - ) + speak_emote = list("groans") loot = list( - /obj/effect/mob_spawn/human/corpse/whitesands/survivor, - /obj/effect/spawner/lootdrop/whitesands/survivor + /obj/effect/mob_spawn/human/corpse/damaged/whitesands ) del_on_death = 1 faction = list("hermit") @@ -78,8 +68,7 @@ name = "Hermit Hunter" desc ="A wild-eyed figure. Watch out- he has a gun, and he remembers just enough of his old life to use it!" loot = list( - /obj/effect/mob_spawn/human/corpse/whitesands/survivor/hunter, - /obj/effect/spawner/lootdrop/whitesands/survivor/hunter + /obj/effect/mob_spawn/human/corpse/damaged/whitesands/hunter, ) /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger @@ -93,6 +82,277 @@ rapid_fire_delay = 3 casingtype = /obj/item/ammo_casing/a545_39/recycled loot = list( - /obj/effect/mob_spawn/human/corpse/whitesands/survivor/gunslinger, - /obj/effect/spawner/lootdrop/whitesands/survivor/gunslinger + /obj/effect/mob_spawn/human/corpse/damaged/whitesands/gunslinger, + ) + +//survivor corpses + +/obj/effect/mob_spawn/human/corpse/damaged/whitesands + var/survivor_type //room for alternatives inside the fuckoff grade init. + +/obj/effect/mob_spawn/human/corpse/damaged/whitesands/Initialize() //everything here should equal out to 100 for the sake of my sanity. + + mob_species = pickweight(list( + /datum/species/human = 50, + /datum/species/lizard = 25, + /datum/species/ethereal = 10, + /datum/species/moth = 10, + /datum/species/spider = 3, + /datum/species/fly = 2 + ) + ) + //to-do: learn how to make mobsprites for other survivors + //uniforms are random to show varied backgrounds, but similar goal + if(survivor_type == "survivor") + uniform = pickweight(list( + /obj/item/clothing/under/color/random = 65, + /obj/item/clothing/under/rank/cargo/miner/lavaland = 10, + /obj/item/clothing/under/rank/prisoner = 10, + /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 5, + /obj/item/clothing/under/color/khaki/buster = 5, + /obj/item/clothing/under/rank/cargo/miner = 5 + ) + ) + else if (survivor_type == "hunter") + uniform = pickweight(list( + /obj/item/clothing/under/color/random = 50, + /obj/item/clothing/under/rank/cargo/miner/lavaland = 25, + /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15, + /obj/item/clothing/under/rank/security/officer/camo = 5, + /obj/item/clothing/under/utility = 5 + ) + ) + else if (survivor_type == "gunslinger") + uniform = pickweight(list( + /obj/item/clothing/under/rank/cargo/miner/lavaland = 35, + /obj/item/clothing/under/color/random = 25, + /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15, + /obj/item/clothing/under/rank/security/officer/camo = 10, + /obj/item/clothing/under/syndicate/camo = 10, + /obj/item/clothing/under/syndicate/combat = 5 + ) + ) + else + uniform = /obj/item/clothing/under/color/random + + //storage is semi-randomized, giving some variety + if(survivor_type == "survivor") + belt = pickweight(list( + /obj/item/storage/belt/fannypack = 40, + /obj/item/storage/belt/mining = 20, + /obj/item/storage/belt/mining/alt = 15, + /obj/item/storage/belt/utility = 10, + /obj/item/storage/belt/bandolier = 9, + /obj/item/storage/belt/utility/full = 5, + /obj/item/storage/belt/chameleon= 1, + ) + ) + else if(survivor_type == "hunter") + belt = pickweight(list( + /obj/item/storage/belt/mining = 30, + /obj/item/storage/belt/fannypack = 20, + /obj/item/storage/belt/mining/alt = 15, + /obj/item/storage/belt/mining/primitive = 15, + /obj/item/storage/belt/bandolier = 10, + /obj/item/storage/belt/military = 7, + /obj/item/storage/belt/mining/vendor = 3, + ) + ) + else if(survivor_type == "gunslinger") + belt = pickweight(list( + /obj/item/storage/belt/mining = 30, + /obj/item/storage/belt/bandolier = 30, + /obj/item/storage/belt/military = 20, + /obj/item/storage/belt/fannypack = 15, + /obj/item/storage/belt/mining/alt = 5, + /obj/item/storage/belt/mining/primitive = 5 + ) + ) + else + belt = /obj/item/storage/belt/fannypack + + //everyone wears the same suit + suit = /obj/item/clothing/suit/hooded/survivor + + if (survivor_type == "gunslinger") + if(prob(30)) + shoes = /obj/item/clothing/shoes/combat //but sometimes there are nicer shoes + else + shoes = /obj/item/clothing/shoes/workboots/mining + else + shoes = /obj/item/clothing/shoes/workboots/mining + + + + + //gloves are a tossup + gloves = pickweight(list( + /obj/item/clothing/gloves/color/black = 60, + /obj/item/clothing/gloves/explorer = 30, + /obj/item/clothing/gloves/explorer/old = 10 + ) + ) + + //bags are semi-random. + back = pickweight(list( + /obj/item/storage/backpack = 20, + /obj/item/storage/backpack/explorer = 20, + /obj/item/storage/backpack/satchel = 20, + /obj/item/storage/backpack/satchel/explorer = 20, + /obj/item/storage/backpack/messenger = 20 + ) + ) + + //as are bag contents + backpack_contents = list() + if(prob(70)) + backpack_contents += pickweight(list( //these could stand to be expanded, right now they're just mildly modified miner ones, and I don't know how to plus that up. + /obj/item/soap = 10, + /obj/item/stack/marker_beacon/ten = 15, + /obj/item/mining_scanner = 5, + /obj/item/extinguisher/mini = 10, + /obj/item/kitchen/knife/combat = 5, + /obj/item/flashlight/seclite = 10, + /obj/item/stack/sheet/sinew = 10, + /obj/item/stack/sheet/bone = 5, + /obj/item/stack/sheet/animalhide/goliath_hide = 10, + /obj/item/stack/sheet/bone = 8, + /obj/item/reagent_containers/food/drinks/waterbottle = 10, + /obj/item/reagent_containers/food/drinks/waterbottle/empty = 2, + ) + ) + if(prob(70)) + backpack_contents += pickweight(list( + /obj/item/stack/sheet/animalhide/goliath_hide = 20, + /obj/item/stack/marker_beacon/ten = 10, + /obj/item/mining_scanner = 20, + /obj/item/extinguisher/mini = 10, + /obj/item/kitchen/knife/combat/survival = 10, + /obj/item/flashlight/seclite = 10, + /obj/item/stack/sheet/sinew = 10, + /obj/item/stack/sheet/bone = 10 + ) + ) + if(prob(70)) + backpack_contents += pickweight(list( + /obj/item/stack/sheet/animalhide/goliath_hide = 5, + /obj/item/stack/marker_beacon/ten = 5, + /obj/item/mining_scanner = 5, + /obj/item/extinguisher/mini = 10, + /obj/item/kitchen/knife/combat/survival = 12, + /obj/item/flashlight/seclite = 10, + /obj/item/stack/sheet/sinew = 5, + /obj/item/stack/sheet/bone = 5, + /obj/item/kitchen/knife/combat = 3, + /obj/item/reagent_containers/food/snacks/rationpack = 30 + ) + ) + if (prob(15)) //mayhaps a medkit + backpack_contents += pickweight(list( + /obj/item/storage/firstaid/regular = 50, + /obj/item/storage/firstaid/brute = 15, + /obj/item/storage/firstaid/medical = 15, + /obj/item/storage/firstaid/fire = 10, + /obj/item/storage/firstaid/advanced = 5, + /obj/item/storage/firstaid/ancient = 5 + ) + ) + if(prob(30)) //some pens maybe? + backpack_contents += /obj/item/reagent_containers/hypospray/medipen/survival + + //pockets + if(survivor_type == "survivor") //could also use fleshing out + if(prob(30)) + l_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath + else + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + if (prob(20)) + r_pocket = /obj/item/spacecash/bundle/mediumrand + else + r_pocket = null + + if(survivor_type == "hunter") + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + if (prob(20)) + r_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath + else if (prob(60)) + r_pocket = /obj/item/ammo_box/aac_300blk_stripper + else + r_pocket = null + + if(survivor_type == "gunslinger") + if(prob(50)) + l_pocket = /obj/item/ammo_box/magazine/aks74u + r_pocket = /obj/item/tank/internals/emergency_oxygen/engi + + else + r_pocket = /obj/item/tank/internals/emergency_oxygen/engi + l_pocket = /obj/item/radio + + //masks + mask = pickweight(list( + /obj/item/clothing/mask/gas = 40, + /obj/item/clothing/mask/gas/explorer = 20, + /obj/item/clothing/mask/gas/explorer/old = 20, + /obj/item/clothing/mask/gas/syndicate = 20, + ) ) + + //the eyes are the window into the soul. I don't think these things have souls but whatever. + if(prob(70)) + glasses = pickweight(list( + /obj/item/clothing/glasses/heat = 20, + /obj/item/clothing/glasses/cold = 20, + /obj/item/clothing/glasses/meson = 40, + /obj/item/clothing/glasses = 20 + ) + ) + else + glasses = null + + //and of course, ears. + if(prob(1)) //oh my god they can't hear the sandstorm coming they've got airpods in + ears = /obj/item/instrument/piano_synth/headphones/spacepods + else + ears = pickweight(list( + /obj/item/radio/headset = 50, + /obj/item/radio/headset/alt = 50 + ) + ) + + //exosuit bits + suit_store = null + if (survivor_type == "hunter") + if(prob(20)) + new /obj/item/gun/ballistic/rifle/boltaction/polymer(loc) + else + visible_message("The hunter's weapon shatters as they impact the ground!") + suit_store = null + if(survivor_type == "gunslinger") + if(prob(20)) + new /obj/item/gun/ballistic/automatic/smg/aks74u(loc) + else + visible_message("The gunslinger's weapon shatters as they impact the ground!") + suit_store = null + . = ..() + + +/obj/effect/mob_spawn/human/corpse/damaged/whitesands/survivor + survivor_type = "survivor" + +/obj/effect/mob_spawn/human/corpse/damaged/whitesands/hunter + survivor_type = "hunter" + +/obj/effect/mob_spawn/human/corpse/damaged/whitesands/gunslinger + survivor_type = "gunslinger" + +//hold overs for any admin who may want to spawn their own survivor realmobs + +/datum/outfit/whitesands + name = "Whitesands Survivor" + uniform = /obj/item/clothing/under/color/random + back = /obj/item/storage/backpack + shoes = /obj/item/clothing/shoes/workboots/mining + suit = /obj/item/clothing/suit/hooded/survivor + r_pocket = /obj/item/tank/internals/emergency_oxygen/engi + gloves = /obj/item/clothing/gloves/color/black //randomize a bit diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index fde9d4c42b5f..8d14b2d01c58 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -409,7 +409,7 @@ return /mob/living/simple_animal/slime/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!") if (stat == DEAD) . += "It is limp and unresponsive." else @@ -436,7 +436,7 @@ if(10) . += "It is radiating with massive levels of electrical activity!" - . += "*---------*" + . += "" /mob/living/simple_animal/slime/proc/discipline_slime(mob/user) if(stat) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ba52ac29b3a0..9e4b8cd84c84 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -465,6 +465,7 @@ return face_atom(A) + var/list/result if(client) LAZYINITLIST(client.recent_examines) @@ -479,8 +480,12 @@ else result = A.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist? + if(result.len) + for(var/i in 1 to (length(result) - 1)) + result[i] += "\n" + + to_chat(src, examine_block("[result.Join()]")) - to_chat(src, result.Join("\n")) SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 5059d7b0e6bb..3615797e8466 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -4,7 +4,7 @@ /obj/item/modular_computer name = "modular microcomputer" desc = "A small portable microcomputer." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "laptop-open" light_on = FALSE integrity_failure = 0.5 diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 9d29b23e767d..3c741e987ea5 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -81,7 +81,6 @@ hard_drive.store_file(new/datum/computer_file/program/chatclient()) hard_drive.store_file(new/datum/computer_file/program/card_mod()) hard_drive.store_file(new/datum/computer_file/program/job_management()) - hard_drive.store_file(new/datum/computer_file/program/crew_manifest()) // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm deleted file mode 100644 index 7b6c97979468..000000000000 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/computer_file/program/crew_manifest - filename = "plexagoncrew" - filedesc = "Plexagon Crew List" - program_icon_state = "id" - extended_desc = "Program for viewing and printing the current crew manifest" - transfer_access = ACCESS_HEADS - requires_ntnet = TRUE - size = 4 - tgui_id = "NtosCrewManifest" - program_icon = "clipboard-list" - -/datum/computer_file/program/crew_manifest/ui_static_data(mob/user) - var/list/data = list() - data["manifest"] = SSjob.get_manifest() - return data - -/datum/computer_file/program/crew_manifest/ui_data(mob/user) - var/list/data = get_header_data() - - var/obj/item/computer_hardware/printer/printer - if(computer) - printer = computer.all_components[MC_PRINT] - - if(computer) - data["have_printer"] = !!printer - else - data["have_printer"] = FALSE - return data - -/datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - - var/obj/item/computer_hardware/printer/printer - if(computer) - printer = computer.all_components[MC_PRINT] - - switch(action) - if("PRG_print") - if(computer && printer) //This option should never be called if there is no printer - var/contents = {"
Crew Manifest
-- [SSjob.get_manifest_html()] - "} - if(!printer.print_text(contents,text("crew manifest ([])", station_time_timestamp()))) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") - return - else - computer.visible_message("\The [computer] prints out a paper.") diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index 7e8d13ea3a22..ab07c4789f85 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -34,6 +34,16 @@ /// store an ntnet relay for tablets on the ship var/obj/machinery/ntnet_relay/integrated/ntnet_relay +/obj/machinery/computer/helm/retro + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-retro" + deconpath = /obj/structure/frame/computer/retro + +/obj/machinery/computer/helm/solgov + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-solgov" + deconpath = /obj/structure/frame/computer/solgov + /datum/config_entry/number/bluespace_jump_wait default = 30 MINUTES @@ -292,6 +302,7 @@ if("toggle_engine") var/obj/machinery/power/shuttle/engine/E = locate(params["engine"]) in current_ship.shuttle_port.engine_list E.enabled = !E.enabled + E.update_icon_state() current_ship.refresh_engines() return if("change_burn_percentage") @@ -395,11 +406,15 @@ /obj/machinery/computer/helm/viewscreen name = "ship viewscreen" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "telescreen" + icon_state = "wallconsole" + icon_screen = "wallconsole_navigation" + icon_keyboard = null layer = SIGN_LAYER density = FALSE viewer = TRUE + unique_icon = TRUE + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/helm/viewscreen, 17) #undef JUMP_STATE_OFF #undef JUMP_STATE_CHARGING diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index 05949b778cf9..d95f35996903 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -77,6 +77,7 @@ if(!..() || (!COOLDOWN_FINISHED(src, rename_cooldown) && !force)) return FALSE message_admins("[key_name_admin(usr)] renamed vessel '[oldname]' to '[new_name]'") + log_admin("[key_name(src)] has renamed vessel '[oldname]' to '[new_name]'") shuttle_port?.name = new_name ship_account.account_holder = new_name if(shipkey) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index d78a705f9a72..5040c3956c37 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -27,6 +27,13 @@ desc = "A white folder." icon_state = "folder_white" +/obj/item/folder/solgov + desc = "A blue folder with a SolGov seal." + icon_state = "folder_solgov" + +/obj/item/folder/terragov + desc = "A green folder with a Terran Regency seal." + icon_state = "folder_terragov" /obj/item/folder/update_overlays() . = ..() @@ -122,3 +129,22 @@ . = ..() new /obj/item/documents/syndicate/mining(src) update_icon() + +/obj/item/folder/solgov/red + desc = "A blue folder with a SolGov seal." + icon_state = "folder_solgovred" + +/obj/item/folder/solgov/red/Initialize() + . = ..() + new /obj/item/documents/solgov(src) + update_icon() + + +/obj/item/folder/terragov/red + desc = "A green folder with a Terran Regency seal." + icon_state = "folder_terragovred" + +/obj/item/folder/terragov/red/Initialize() + . = ..() + new /obj/item/documents/terragov(src) + update_icon() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 063cd4c07b53..1ab74e4d6a3b 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -140,21 +140,7 @@ /obj/machinery/power/apc/auto_name auto_name = TRUE -/obj/machinery/power/apc/auto_name/north //Pixel offsets get overwritten on New() - dir = NORTH - pixel_y = 23 - -/obj/machinery/power/apc/auto_name/south - dir = SOUTH - pixel_y = -23 - -/obj/machinery/power/apc/auto_name/east - dir = EAST - pixel_x = 24 - -/obj/machinery/power/apc/auto_name/west - dir = WEST - pixel_x = -25 +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25) /obj/machinery/power/apc/get_cell() return cell @@ -179,8 +165,7 @@ if (building) setDir(ndir) tdir = dir // to fix Vars bug - setDir(SOUTH) - +//!!!!!!!!!!!!!! FUCK YOU SINGLE LINE OF CODE!! FUCK YOU YOU PIECE OF SHIT!!!!! setDir(SOUTH) switch(tdir) if(NORTH) if((pixel_y != initial(pixel_y)) && (pixel_y != 23)) @@ -308,6 +293,8 @@ icon_state = "apc0" else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) var/basestate = "apc[ cell ? "2" : "1" ]" + if(has_electronics == APC_ELECTRONICS_INSTALLED) //god + . += "apc-electronics" if(update_state & UPSTATE_OPENED1) if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) icon_state = "apcmaint" //disabled APC cannot hold cell @@ -330,6 +317,16 @@ if(!(update_state & UPSTATE_ALLGOOD)) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + if(!cell) //it always peeved me that abandoned ships always had the apc lights on. this should fix it + icon_update_needed = FALSE + set_light(0) + return + + if(cell.charge <= 0) + icon_update_needed = FALSE + set_light(0) + return + if(update & 2) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(machine_stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 5b5deec14509..eaa1e296875a 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -21,13 +21,16 @@ icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-item" result_path = /obj/structure/light_construct + pixel_shift = 32 inverse = TRUE + inverse_pixel_shift = TRUE /obj/item/wallframe/light_fixture/small name = "small light fixture frame" icon_state = "bulb-construct-item" result_path = /obj/structure/light_construct/small custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) + pixel_shift = 28 /obj/item/wallframe/light_fixture/try_build(turf/on_wall, user) if(!..()) @@ -57,6 +60,8 @@ var/cell_connectors = TRUE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/light_construct, 32) + /obj/structure/light_construct/Initialize(mapload, ndir, building) . = ..() if(building) @@ -174,6 +179,8 @@ if("bulb") newlight = new /obj/machinery/light/small/built(loc) newlight.setDir(dir) + newlight.pixel_x = pixel_x + newlight.pixel_y = pixel_y transfer_fingerprints_to(newlight) if(cell) newlight.cell = cell @@ -199,15 +206,14 @@ fixture_type = "bulb" sheets_refunded = 1 - +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/light_construct/small, 28) // the standard tube light fixture /obj/machinery/light name = "light fixture" icon = 'icons/obj/lighting.dmi' - var/overlayicon = 'icons/obj/lighting_overlay.dmi' var/base_state = "tube" // base description and icon_state - icon_state = "tube" + icon_state = "tube-on" desc = "A lighting fixture." layer = WALL_OBJ_LAYER max_integrity = 100 @@ -249,19 +255,25 @@ var/bulb_vacuum_colour = "#4F82FF" // colour of the light when air alarm is set to severe var/bulb_vacuum_brightness = 8 +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light, 32) + /obj/machinery/light/broken status = LIGHT_BROKEN icon_state = "tube-broken" +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/broken, 32) + /obj/machinery/light/dim nightshift_allowed = FALSE bulb_colour = "#FFDDCC" bulb_power = 0.8 +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/dim, 32) + // the smaller bulb light fixture /obj/machinery/light/small - icon_state = "bulb" + icon_state = "bulb-on" base_state = "bulb" fitting = "bulb" brightness = 4 @@ -270,10 +282,14 @@ bulb_colour = "#FFDDBB" //Cit lighting bulb_power = 0.75 //Cit lighting +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small, 28) + /obj/machinery/light/small/broken status = LIGHT_BROKEN icon_state = "bulb-broken" +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/broken, 28) + /obj/machinery/light/Move() if(status != LIGHT_BROKEN) break_light_tube(1) @@ -283,6 +299,8 @@ icon_state = "tube-empty" start_with_cell = FALSE +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/built, 32) + /obj/machinery/light/built/Initialize() . = ..() status = LIGHT_EMPTY @@ -292,6 +310,8 @@ icon_state = "bulb-empty" start_with_cell = FALSE +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28) + /obj/machinery/light/small/built/Initialize() . = ..() status = LIGHT_EMPTY @@ -355,6 +375,8 @@ icon_state = "[base_state]_emergency" else if (A?.vacuum) icon_state = "[base_state]_vacuum" + else if (on) + icon_state = "[base_state]-on" else icon_state = "[base_state]" if(LIGHT_EMPTY) @@ -364,18 +386,6 @@ if(LIGHT_BROKEN) icon_state = "[base_state]-broken" -/obj/machinery/light/update_overlays() - . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - if(on && status == LIGHT_OK) - var/area/A = get_area(src) - if(emergency_mode || (A?.fire)) - SSvis_overlays.add_vis_overlay(src, overlayicon, "[base_state]_emergency", layer, plane, dir) - else if (nightshift_enabled) - SSvis_overlays.add_vis_overlay(src, overlayicon, "[base_state]_nightshift", layer, plane, dir) - else - SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, layer, plane, dir) - // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(trigger = TRUE) switch(status) @@ -556,6 +566,8 @@ newlight = new /obj/structure/light_construct/small(src.loc) newlight.icon_state = "bulb-construct-stage[cur_stage]" newlight.setDir(src.dir) + newlight.pixel_x = pixel_x + newlight.pixel_y = pixel_y newlight.stage = cur_stage if(!disassembled) newlight.obj_integrity = newlight.max_integrity * 0.5 diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index b8cf086c9a48..b1c2a95a938f 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -21,6 +21,16 @@ var/next_record = 0 var/is_secret_monitor = FALSE +/obj/machinery/computer/monitor/retro + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-retro" + deconpath = /obj/structure/frame/computer/retro + +/obj/machinery/computer/monitor/solgov + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-solgov" + deconpath = /obj/structure/frame/computer/solgov + /obj/machinery/computer/monitor/secret //Hides the power monitor (such as ones on ruins & CentCom) from PDA's to prevent metagaming. name = "outdated power monitoring console" desc = "It monitors power levels across the local powernet." diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 0caa492a0f74..c25a2fdb82b0 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -316,7 +316,7 @@ /obj/machinery/power/solar_control name = "solar panel control" desc = "A controller for solar panel arrays." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "computer" density = TRUE use_power = IDLE_POWER_USE diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 40c5bd0b64a6..4217d2e45199 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -143,6 +143,12 @@ burst_size = 0 actions_types = list() +/obj/item/gun/ballistic/automatic/gal/inteq + name = "\improper SsG-04" + desc = "A marksman rifle purchased from the Colonial Minutemen and modified to suit IRMG's needs. Chambered in .308." + icon_state = "gal-inteq" + item_state = "gal-inteq" + /obj/item/gun/ballistic/automatic/zip_pistol name = "makeshift pistol" desc = "A makeshift pistol. It's a miracle it even works." diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index c48c4b54ea09..73eada04055b 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -22,6 +22,7 @@ w_class = WEIGHT_CLASS_SMALL cell_type = /obj/item/stock_parts/cell/gun/mini small_gun = TRUE + throwforce = 11 //This is funny, trust me. ammo_x_offset = 2 charge_sections = 3 can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a8458abd2955..ecf7e647bdde 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -233,6 +233,10 @@ var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color +//Mecha version of the KA projectile + +/obj/projectile/kinetic/mech + range = 5 //Modkits /obj/item/borg/upgrade/modkit diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 86382f3a0b10..462c97c4aaee 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -238,13 +238,14 @@ if(isalien(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) var/obj/item/bodypart/B = L.get_bodypart(def_zone) - // WS edit - Fix various startup runtimes if(B && !IS_ORGANIC_LIMB(B)) // So if you hit a robotic, it sparks instead of bloodspatters do_sparks(2, FALSE, target.loc) - if(prob(25)) - new /obj/effect/decal/cleanable/oil(target_loca) else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + var/splatter_color = null + if(iscarbon(L)) + var/mob/living/carbon/carbon_target = L + splatter_color = carbon_target.dna.blood_type.color + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, splatter_color) if(prob(33)) L.add_splatter_floor(target_loca) else if(impact_effect_type && !hitscan) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 5e17e714f22c..657e9a5bc57c 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -11,6 +11,7 @@ idle_power_usage = 20 resistance_flags = ACID_PROOF circuit = /obj/item/circuitboard/computer/pandemic + unique_icon = TRUE var/wait var/datum/symptom/selected_symptom diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index aa2d475ab545..163d91105342 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -717,10 +717,9 @@ color = "#eef442" // rgb: 238, 244, 66 taste_description = "mournful honking" - /datum/reagent/consumable/liquidelectricity name = "Liquid Electricity" - description = "The blood of elzuosa, and the stuff that keeps them going. Great for them, horrid for anyone else." + description = "A glowing, viscous substance that radiates pure energy." //this is no longer Elzousa blood nutriment_factor = 5 * REAGENTS_METABOLISM color = "#97ee63" taste_description = "pure electricity" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 27f0136d64ca..00a99434b6a5 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,7 +1,7 @@ /datum/reagent/blood data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) name = "Blood" - color = "#C80000" // rgb: 200, 0, 0 + color = COLOR_BLOOD metabolization_rate = 5 //fast rate so it disappears fast. taste_description = "iron" taste_mult = 1.3 @@ -24,17 +24,22 @@ L.ForceContractDisease(D) if(iscarbon(L)) - var/mob/living/carbon/C = L - if(C.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) - if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5) - else - C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) + var/mob/living/carbon/exposed_carbon = L + if(exposed_carbon.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits)))) + if(data && data["blood_type"]) + var/datum/blood_type/blood_type = data["blood_type"] + if(blood_type.type in exposed_carbon.dna.blood_type.compatible_types) + exposed_carbon.blood_volume = min(exposed_carbon.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) + return + exposed_carbon.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5) /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) + var/datum/blood_type/blood_type = data["blood_type"] + if(blood_type) + color = blood_type.color /datum/reagent/blood/on_merge(list/mix_data) if(data && mix_data) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index ebb7dfd3a9a8..d50605dcd7f6 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -89,16 +89,26 @@ results = list(/datum/reagent/consumable/condensedcapsaicin = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5) -/datum/chemical_reaction/soapification +/datum/chemical_reaction/gibsoapification required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles required_temp = 374 mob_react = FALSE -/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/gibsoapification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/soap/homemade(location) +/datum/chemical_reaction/oilsoapification + required_reagents = list(/datum/reagent/consumable/cooking_oil = 10, /datum/reagent/lye = 10) + required_temp = 374 + mob_react = FALSE + +/datum/chemical_reaction/oilsoapification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/soap(location) + /datum/chemical_reaction/omegasoapification required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) required_temp = 999 diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 75978aeefe55..c1aea0bd5ef7 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" volume = 200 - var/blood_type = null + var/datum/blood_type/blood_type = null var/unique_blood = null var/labelled = 0 fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) @@ -12,7 +12,7 @@ /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("viruses"=null,"blood_DNA"=null,"blood_type"=get_blood_type(blood_type),"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change(changetype) @@ -28,7 +28,7 @@ /obj/item/reagent_containers/blood/proc/update_pack_name() if(!labelled) if(blood_type) - name = "blood pack - [blood_type]" + name = "blood pack[blood_type ? " - [unique_blood ? blood_type : blood_type.name]" : null]" else name = "blood pack" @@ -61,6 +61,12 @@ /obj/item/reagent_containers/blood/lizard blood_type = "L" +/obj/item/reagent_containers/blood/elzuose + blood_type = "E" + +/obj/item/reagent_containers/blood/synthetic + blood_type = "Coolant" + /obj/item/reagent_containers/blood/squid blood_type = "S" diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 30e4602606a9..4af718eb13f8 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -158,6 +158,22 @@ build_path = /obj/item/organ/ears/cat category = list("initial",SPECIES_HUMAN) +/datum/design/fox_tail + name = "Fox Tail" + id = "foxtail" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) + build_path = /obj/item/organ/tail/fox + category = list("initial",SPECIES_HUMAN) + +/datum/design/fox_ears + name = "Fox Ears" + id = "foxears" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 10) + build_path = /obj/item/organ/ears/fox + category = list("initial",SPECIES_HUMAN) + /datum/design/dwarf_gland name = "Dwarf Gland" id = "dwarfgland" diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 837123d9246a..61fb07e77502 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -451,3 +451,13 @@ construction_time = 250 build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam category = list("Exosuit Equipment") + +/datum/design/mecha_kineticgun + name = "Exosuit Mining (Proto-kinetic Accelerator)" + desc = "An exosuit-mounted mining tool that does increased damage in low pressure. Drawing from an onboard power source allows it to project further than the handheld version." + id = "mecha_kineticgun" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun + materials = list(/datum/material/iron = 8000, /datum/material/glass = 1000) + construction_time = 100 + category = list("Exosuit Equipment") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 8c40528e332c..f9c735054a3d 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1,144 +1,136 @@ //Cyborg -/datum/design/borg_suit +/datum/design/borg + build_type = MECHFAB + category = list("Cyborg") + research_icon = 'icons/mob/augmentation/augments.dmi' + +/datum/design/borg/suit name = "Cyborg Endoskeleton" id = "borg_suit" - build_type = MECHFAB + research_icon_state = "robo_suit" build_path = /obj/item/robot_suit materials = list(/datum/material/iron=15000) construction_time = 500 - category = list("Cyborg") -/datum/design/borg_chest +/datum/design/borg/chest name = "Cyborg Torso" id = "borg_chest" - build_type = MECHFAB + research_icon_state = "borg_chest" build_path = /obj/item/bodypart/chest/robot materials = list(/datum/material/iron=40000) construction_time = 350 - category = list("Cyborg") -/datum/design/borg_head +/datum/design/borg/head name = "Cyborg Head" id = "borg_head" - build_type = MECHFAB + research_icon_state = "borg_head" build_path = /obj/item/bodypart/head/robot materials = list(/datum/material/iron=5000) construction_time = 350 - category = list("Cyborg") -/datum/design/borg_l_arm +/datum/design/borg/l_arm name = "Cyborg Left Arm" id = "borg_l_arm" - build_type = MECHFAB + research_icon_state = "borg_l_arm" build_path = /obj/item/bodypart/l_arm/robot materials = list(/datum/material/iron=10000) construction_time = 200 - category = list("Cyborg") -/datum/design/borg_r_arm +/datum/design/borg/r_arm name = "Cyborg Right Arm" id = "borg_r_arm" - build_type = MECHFAB + research_icon_state = "borg_r_arm" build_path = /obj/item/bodypart/r_arm/robot materials = list(/datum/material/iron=10000) construction_time = 200 - category = list("Cyborg") -/datum/design/borg_l_leg +/datum/design/borg/l_leg name = "Cyborg Left Leg" id = "borg_l_leg" - build_type = MECHFAB + research_icon_state = "borg_l_leg" build_path = /obj/item/bodypart/leg/left/robot materials = list(/datum/material/iron=10000) construction_time = 200 - category = list("Cyborg") -/datum/design/borg_r_leg +/datum/design/borg/r_leg name = "Cyborg Right Leg" id = "borg_r_leg" - build_type = MECHFAB + research_icon_state = "borg_r_leg" build_path = /obj/item/bodypart/leg/right/robot materials = list(/datum/material/iron=10000) - construction_time = 200 - category = list("Cyborg") + //Prosthetics -/datum/design/prosthetic_l_arm - name = "Surplus Prosthetic Left Arm" - id = "prosthetic_l_arm" +/datum/design/prosthetic + research_icon = 'icons/mob/augmentation/augments.dmi' build_type = PROTOLATHE | MECHFAB - build_path = /obj/item/bodypart/l_arm/robot/surplus - materials = list(/datum/material/iron=3000) construction_time = 5 SECONDS - category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + materials = list(/datum/material/iron=3000) + category = list("Misc", "Medical Designs") + +/datum/design/prosthetic/l_arm + name = "Surplus Prosthetic Left Arm" + id = "prosthetic_l_arm" + research_icon_state = "borg_l_arm" + build_path = /obj/item/bodypart/l_arm/robot/surplus -/datum/design/prosthetic_r_arm +/datum/design/prosthetic/r_arm name = "Surplus Prosthetic Right Arm" id = "prosthetic_r_arm" - build_type = PROTOLATHE | MECHFAB + research_icon_state = "borg_r_arm" build_path = /obj/item/bodypart/r_arm/robot/surplus - materials = list(/datum/material/iron=3000) - construction_time = 5 SECONDS - category = list("Misc", "Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/prosthetic_l_leg +/datum/design/prosthetic/l_leg name = "Surplus Prosthetic Left Leg" id = "prosthetic_l_leg" - build_type = PROTOLATHE | MECHFAB + research_icon_state = "borg_l_leg" build_path = /obj/item/bodypart/leg/left/robot/surplus - materials = list(/datum/material/iron=3000) - construction_time = 5 SECONDS - category = list("Misc", "Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/prosthetic_r_leg +/datum/design/prosthetic/r_leg name = "Surplus Prosthetic Right Leg" id = "prosthetic_r_leg" - build_type = PROTOLATHE | MECHFAB + research_icon_state = "borg_r_leg" build_path = /obj/item/bodypart/leg/right/robot/surplus - materials = list(/datum/material/iron=3000) - construction_time = 5 SECONDS - category = list("Misc", "Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/prosthetic_l_arm/kepori +// Kepori +/datum/design/prosthetic/l_arm/kepori name = "Surplus Prosthetic Kepori Left Arm" id = "kprosthetic_l_arm" build_path = /obj/item/bodypart/l_arm/robot/surplus/kepori -/datum/design/prosthetic_r_arm/kepori +/datum/design/prosthetic/r_arm/kepori name = "Surplus Prosthetic Kepori Right Arm" id = "kprosthetic_r_arm" build_path = /obj/item/bodypart/r_arm/robot/surplus/kepori -/datum/design/prosthetic_l_leg/kepori +/datum/design/prosthetic/l_leg/kepori name = "Surplus Prosthetic Kepori Left Leg" id = "kprosthetic_l_leg" build_path = /obj/item/bodypart/leg/left/robot/surplus/kepori -/datum/design/prosthetic_r_leg/kepori +/datum/design/prosthetic/r_leg/kepori name = "Surplus Prosthetic Kepori Right Leg" id = "kprosthetic_r_leg" build_path = /obj/item/bodypart/leg/right/robot/surplus/kepori -/datum/design/prosthetic_l_arm/vox +// Vox +/datum/design/prosthetic/l_arm/vox name = "Surplus Prosthetic Vox Left Arm" id = "vprosthetic_l_arm" build_path = /obj/item/bodypart/l_arm/robot/surplus/vox -/datum/design/prosthetic_r_arm/vox +/datum/design/prosthetic/r_arm/vox name = "Surplus Prosthetic Vox Right Arm" id = "vprosthetic_r_arm" build_path = /obj/item/bodypart/r_arm/robot/surplus/vox -/datum/design/prosthetic_l_leg/vox +/datum/design/prosthetic/l_leg/vox name = "Surplus Prosthetic Vox Left Leg" id = "vprosthetic_l_leg" build_path = /obj/item/bodypart/leg/left/robot/surplus/vox -/datum/design/prosthetic_r_leg/vox +/datum/design/prosthetic/r_leg/vox name = "Surplus Prosthetic Vox Right Leg" id = "vprosthetic_r_leg" build_path = /obj/item/bodypart/leg/right/robot/surplus/vox @@ -936,6 +928,15 @@ construction_time = 100 category = list("IPC Components") +/datum/design/robotic_heart + name = "Coolant Pump" + id = "robotic_heart" + build_type = MECHFAB + build_path = /obj/item/organ/heart/cybernetic/ipc + materials = list(/datum/material/iron = 2000, /datum/material/glass = 2000, /datum/material/silver = 500) + construction_time = 100 + category = list("IPC Components") + /datum/design/robotic_stomach name = "Micro-cell" id = "robotic_stomach" diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 65fbaaf405f7..ab45638bbbae 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/machines/research.dmi' icon_state = "nanite_cloud_controller" circuit = /obj/item/circuitboard/computer/nanite_cloud_controller + unique_icon = TRUE var/obj/item/disk/nanite_program/disk var/list/datum/nanite_cloud_backup/cloud_backups = list() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 27d974f0fb29..b99960b812b5 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -1235,6 +1235,16 @@ Nothing else in the console has ID requirements. req_access = null req_access_txt = "29" +/obj/machinery/computer/rdconsole/robotics/retro + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-retro" + deconpath = /obj/structure/frame/computer/retro + +/obj/machinery/computer/rdconsole/robotics/solgov + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-solgov" + deconpath = /obj/structure/frame/computer/solgov + /obj/machinery/computer/rdconsole/robotics/Initialize() . = ..() if(circuit) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 53a8eb224f1c..a6af273e4a15 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -579,7 +579,7 @@ display_name = "Mining Technology" description = "Better than Efficiency V." prereq_ids = list("engineering", "basic_plasma") - design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e) + design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter", "mecha_kineticgun")//e a r l y g a m e) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1202,7 +1202,7 @@ display_name = "IPC Parts" description = "We have the technology to replace him." prereq_ids = list("cyber_organs","robotics") - design_ids = list("robotic_liver", "robotic_eyes", "robotic_tongue", "robotic_stomach", "robotic_ears", "power_cord") + design_ids = list("robotic_liver", "robotic_eyes", "robotic_heart", "robotic_tongue", "robotic_stomach", "robotic_ears", "power_cord") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) export_price = 5000 diff --git a/code/modules/ruins/rockplanet_ruin_code.dm b/code/modules/ruins/rockplanet_ruin_code.dm index 0d583fbe916a..57a6d6fd4657 100644 --- a/code/modules/ruins/rockplanet_ruin_code.dm +++ b/code/modules/ruins/rockplanet_ruin_code.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/doors/crusher.dmi' damage_deflection = 70 glass = TRUE + smoothing_groups = null /obj/machinery/door/poddoor/crusher/crush() . = ..() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 8d1d6d4c9416..0c535f58ae23 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -76,6 +76,8 @@ var/unlocked = FALSE var/datum/overmap/ship/controlled/linked_ship +MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/overmap_ship, 28) + /obj/item/storage/overmap_ship/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) linked_ship = port?.current_ship @@ -96,10 +98,14 @@ ..() new /obj/item/storage/toolbox/emergency/shuttle/fueled(src) +MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/overmap_ship/fueled, 28) + /obj/item/storage/overmap_ship/electric/PopulateContents() ..() new /obj/item/storage/toolbox/emergency/shuttle/electric(src) +MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/overmap_ship/electric, 28) + /obj/item/storage/overmap_ship/attackby(obj/item/W, mob/user, params) if (can_interact(user)) return ..() diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 16e8da479b5b..bf4e4f736556 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -79,7 +79,7 @@ All ShuttleMove procs go here /turf/proc/afterShuttleMove(turf/oldT, rotation, list/all_towed_shuttles) //Dealing with the turf we left behind oldT.TransferComponents(src) - + SEND_SIGNAL(oldT, COMSIG_TURF_AFTER_SHUTTLE_MOVE, src) //Mostly for decals //find the boundary between the shuttle that left and what remains var/area/ship/A = loc var/obj/docking_port/mobile/top_shuttle = A?.mobile_port diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index a2c19c8b2f2f..c1804f8a3f71 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -232,6 +232,7 @@ circuit = /obj/item/circuitboard/computer/bsa_control icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "control_boxp" + unique_icon = TRUE var/obj/machinery/bsa/full/cannon var/notice diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 85b38e244655..48dd4caeeb76 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -63,6 +63,10 @@ var/should_draw_greyscale = TRUE //Limbs need this information as a back-up incase they are generated outside of a carbon (limbgrower) var/species_color = "" var/mutation_color = "" + /// The colour of damage done to this bodypart + var/damage_color = "" + /// Should we even use a color? + var/use_damage_color = FALSE var/no_update = 0 var/animal_origin = null //for nonhuman bodypart (e.g. monkey) @@ -521,7 +525,7 @@ if(no_update) return - if(!is_creating) + if(!is_creating || !owner) return if(!animal_origin && ishuman(C)) @@ -536,6 +540,7 @@ else skin_tone = "" + use_damage_color = S.use_damage_color if(((MUTCOLORS in S.species_traits) || (DYNCOLORS in S.species_traits)) && uses_mutcolor) //Ethereal code. Motherfuckers. if(S.fixed_mut_color) species_color = S.fixed_mut_color @@ -590,7 +595,10 @@ image_dir = SOUTH if(dmg_overlay_type) if(brutestate) - . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) + var/image/bruteoverlay = image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) + if(use_damage_color) + bruteoverlay.color = damage_color + . += bruteoverlay if(burnstate) . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 70626f72993b..300a17e7ab0d 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -2,7 +2,7 @@ /obj/item/bodypart/chest name = BODY_ZONE_CHEST desc = "It's impolite to stare at a person's chest." - icon_state = "default_human_chest" + icon_state = "human_chest" max_damage = 200 body_zone = BODY_ZONE_CHEST body_part = CHEST @@ -61,7 +61,7 @@ Latin 'sinestra' (left hand), because the left hand was supposed to \ be possessed by the devil? This arm appears to be possessed by no \ one though." - icon_state = "default_human_l_arm" + icon_state = "human_l_arm" attack_verb = list("slaps", "punches") max_damage = 50 max_stamina_damage = 50 @@ -163,7 +163,7 @@ name = "right arm" desc = "Over 87% of humans are right handed. That figure is much lower \ among humans missing their right arm." - icon_state = "default_human_r_arm" + icon_state = "human_r_arm" attack_verb = list("slaps", "punches") max_damage = 50 body_zone = BODY_ZONE_R_ARM @@ -265,7 +265,7 @@ name = "left leg" desc = "Some athletes prefer to tie their left shoelaces first for good \ luck. In this instance, it probably would not have helped." - icon_state = "default_human_l_leg" + icon_state = "human_l_leg" attack_verb = list("kicks", "stomps") max_damage = 50 body_zone = BODY_ZONE_L_LEG @@ -358,7 +358,7 @@ shake it all about. And apparently then it detaches.\n\ The hokey pokey has certainly changed a lot since space colonisation." // alternative spellings of 'pokey' are available - icon_state = "default_human_r_leg" + icon_state = "human_r_leg" attack_verb = list("kicks", "stomps") max_damage = 50 body_zone = BODY_ZONE_R_LEG diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 30e39e625f74..ecc911502fc0 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -118,7 +118,7 @@ name = "cyborg torso" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." item_state = "buildpipe" - static_icon = 'icons/mob/augmentation/augments.dmi' + static_icon = 'icons/mob/augmentation/augments.dmi' icon = null limb_id = "robotic" flags_1 = CONDUCT_1 diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index dc402c847363..7ca16b5fea5a 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -31,12 +31,14 @@ /obj/item/bodypart/leg/left/digitigrade icon = 'icons/mob/species/lizard/bodyparts.dmi' + icon_state = "digitigrade_l_leg" uses_mutcolor = TRUE limb_id = "digitigrade" bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE /obj/item/bodypart/leg/right/digitigrade icon = 'icons/mob/species/lizard/bodyparts.dmi' + icon_state = "digitigrade_r_leg" uses_mutcolor = TRUE limb_id = "digitigrade" bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 574e75786ad9..9eb27782a4ed 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -95,37 +95,37 @@ icon_state = "kitty" damage_multiplier = 2 -/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) +/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) ..() - if(istype(H)) - color = H.hair_color - H.dna.species.mutant_bodyparts |= "ears" - H.dna.features["ears"] = "Cat" - H.update_body() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.species.mutant_bodyparts |= "ears" + ear_owner.dna.features["ears"] = "Cat" + ear_owner.update_body() -/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/H, special = 0) +/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/ear_owner, special = 0) ..() - if(istype(H)) - color = H.hair_color - H.dna.features["ears"] = "None" - H.dna.species.mutant_bodyparts -= "ears" - H.update_body() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.features["ears"] = "None" + ear_owner.dna.species.mutant_bodyparts -= "ears" + ear_owner.update_body() /obj/item/organ/ears/penguin name = "penguin ears" desc = "The source of a penguin's happy feet." -/obj/item/organ/ears/penguin/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) +/obj/item/organ/ears/penguin/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) . = ..() - if(istype(H)) - to_chat(H, "You suddenly feel like you've lost your balance.") - H.AddElement(/datum/element/waddling) + if(istype(ear_owner)) + to_chat(ear_owner, "You suddenly feel like you've lost your balance.") + ear_owner.AddElement(/datum/element/waddling) -/obj/item/organ/ears/penguin/Remove(mob/living/carbon/human/H, special = 0) +/obj/item/organ/ears/penguin/Remove(mob/living/carbon/human/ear_owner, special = 0) . = ..() - if(istype(H)) - to_chat(H, "Your sense of balance comes back to you.") - H.RemoveElement(/datum/element/waddling) + if(istype(ear_owner)) + to_chat(ear_owner, "Your sense of balance comes back to you.") + ear_owner.RemoveElement(/datum/element/waddling) /obj/item/organ/ears/cat/slime //Not adding insert code since only slimepeople should ever get this through change_form() name = "slimy cat ears" @@ -134,6 +134,38 @@ icon_state = "kitty" alpha = 150 +/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) + ..() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.species.mutant_bodyparts |= "ears" + ear_owner.dna.features["ears"] = "Cat" + ear_owner.update_body() + +/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/ear_owner, special = 0) + ..() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.features["ears"] = "None" + ear_owner.dna.species.mutant_bodyparts -= "ears" + ear_owner.update_body() + +/obj/item/organ/ears/fox/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) + ..() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.species.mutant_bodyparts |= "ears" + ear_owner.dna.features["ears"] = "Fox" + ear_owner.update_body() + +/obj/item/organ/ears/fox/Remove(mob/living/carbon/human/ear_owner, special = 0) + ..() + if(istype(ear_owner)) + color = ear_owner.hair_color + ear_owner.dna.features["ears"] = "None" + ear_owner.dna.species.mutant_bodyparts -= "ears" + ear_owner.update_body() + /obj/item/organ/ears/bronze name = "tin ears" desc = "The robust ears of a bronze golem. " diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 7a23957322cb..2c7a1a508605 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -17,9 +17,12 @@ var/beating = 1 var/icon_base = "heart" attack_verb = list("beat", "thumped") - var/beat = BEAT_NONE//is this mob having a heatbeat sound played? if so, which? - var/failed = FALSE //to prevent constantly running failing code - var/operated = FALSE //whether the heart's been operated on to fix some of its damages + //is this mob having a heatbeat sound played? if so, which? + var/beat = BEAT_NONE + //to prevent constantly running failing code + var/failed = FALSE + //whether the heart's been operated on to fix some of its damages + var/operated = FALSE /obj/item/organ/heart/update_icon_state() if(beating) @@ -202,6 +205,12 @@ dose_available = TRUE emp_vulnerability = 20 +/obj/item/organ/heart/cybernetic/ipc //this sucks + name = "coolant pump" + desc = "A small pump powered by the IPC's internal systems for circulating coolant." + status = ORGAN_ROBOTIC + emp_vulnerability = 30 + /obj/item/organ/heart/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -211,7 +220,7 @@ owner.losebreath += 10 severe_cooldown = world.time + 20 SECONDS if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. + organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. Stop() owner.visible_message("[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!", \ "You feel a terrible pain in your chest, as if your heart has stopped!") diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm index 5fe65dd448e8..1f5544b8c2de 100644 --- a/code/modules/surgery/organs/tails.dm +++ b/code/modules/surgery/organs/tails.dm @@ -108,3 +108,45 @@ color = "#" + H.dna.features["mcolor"] tail_type = H.dna.features["tail_elzu"] H.update_body() + +/obj/item/organ/tail/fox + name = "fox tail" + desc = "A severed fox tail. Sad." + tail_type = "Fox" + +/obj/item/organ/tail/fox/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) + ..() + if(istype(H)) + if(!("tail_human" in H.dna.species.mutant_bodyparts)) + H.dna.species.mutant_bodyparts |= "tail_human" + H.dna.features["tail_human"] = tail_type + H.update_body() + +/obj/item/organ/tail/fox/Remove(mob/living/carbon/human/H, special = 0) + ..() + if(istype(H)) + H.dna.features["tail_human"] = "None" + H.dna.species.mutant_bodyparts -= "tail_human" + color = H.hair_color + H.update_body() + +/obj/item/organ/tail/fox/alt + name = "fox tail" + desc = "A severed fox tail. Sad." + tail_type = "Fox 2" + +/obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) + ..() + if(istype(H)) + if(!("tail_human" in H.dna.species.mutant_bodyparts)) + H.dna.species.mutant_bodyparts |= "tail_human" + H.dna.features["tail_human"] = tail_type + H.update_body() + +/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0) + ..() + if(istype(H)) + H.dna.features["tail_human"] = "None" + H.dna.species.mutant_bodyparts -= "tail_human" + color = H.hair_color + H.update_body() diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 76672669df72..9c38d709afaf 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -1,13 +1,13 @@ /obj/item/retractor name = "retractor" - desc = "Retracts stuff." + desc = "Features a tensile pivot that helps train slow, precise manipulation. It can even be locked in place." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "retractor" + icon_state = "retractor-1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/surgery2_pickup.ogg' drop_sound = 'sound/items/handling/knife2_drop.ogg' - item_state = "clamps" + item_state = "clamps-1" custom_materials = list(/datum/material/iron=6000, /datum/material/glass=3000) flags_1 = CONDUCT_1 item_flags = SURGICAL_TOOL @@ -22,14 +22,14 @@ /obj/item/hemostat name = "hemostat" - desc = "You think you have seen this before." + desc = "A tiny needle-eye has been machined into one of the clamps to streamline the application of ligature." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "hemostat" + icon_state = "hemostat-1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/surgery2_pickup.ogg' drop_sound = 'sound/items/handling/knife2_drop.ogg' - item_state = "clamps" + item_state = "clamps-1" custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500) flags_1 = CONDUCT_1 item_flags = SURGICAL_TOOL @@ -45,14 +45,14 @@ /obj/item/cautery name = "cautery" - desc = "This stops bleeding." + desc = "An obtuse, rectangular design is just big enough to accomodate this cautery's incredibly durable battery." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "cautery" + icon_state = "cautery-1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/surgery2_pickup.ogg' drop_sound = 'sound/items/handling/knife2_drop.ogg' - item_state = "cautery" + item_state = "cautery-1" custom_materials = list(/datum/material/iron=2500, /datum/material/glass=750) flags_1 = CONDUCT_1 item_flags = SURGICAL_TOOL @@ -68,11 +68,11 @@ /obj/item/surgicaldrill name = "surgical drill" - desc = "You can drill using this item. You dig?" + desc = "The ergonomic foregrip is actually horrible for your hands, however the drill never sees enough use for it to be realized." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "drill" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + icon_state = "drill-1" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/surgery1_pickup.ogg' drop_sound = 'sound/items/handling/metal_drop.ogg' hitsound = 'sound/weapons/circsawhit.ogg' @@ -107,14 +107,14 @@ /obj/item/scalpel name = "scalpel" - desc = "Cut, cut, and once more cut." + desc = "The handle of the scalpel is an awkward ergonomic mold, designed to encourage proper form. A blade release button on the end allows for easy cleaning and replacement." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "scalpel" + icon_state = "scalpel-1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/knife1_pickup.ogg' drop_sound = 'sound/items/handling/knife2_drop.ogg' - item_state = "scalpel" + item_state = "scalpel-1" flags_1 = CONDUCT_1 item_flags = SURGICAL_TOOL | EYE_STAB force = 10 @@ -144,9 +144,10 @@ /obj/item/circular_saw name = "circular saw" - desc = "For heavy duty cutting." + desc = "The protective drill cover often becomes crusted with blood after a few uses, giving this saw a reputation for being high-maintenance." icon = 'icons/obj/surgery.dmi' //SHIPTEST edit: cool and new tools - icon_state = "saw" + icon_state = "saw-1" + item_state = "saw-1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' pickup_sound = 'sound/items/handling/surgery1_pickup.ogg' @@ -274,8 +275,11 @@ /obj/item/scalpel/advanced name = "laser scalpel" - desc = "An advanced scalpel which uses laser technology to cut." - icon_state = "scalpel_a" + desc = "This updated design was released on a fast schedule, aiming to lower the amount of circular saws being turned into makeshift weaponry." + icon_state = "advscalpel" + item_state = "advscalpel" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' hitsound = 'sound/weapons/blade1.ogg' force = 16 toolspeed = 0.7 @@ -289,16 +293,16 @@ playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) if(tool_behaviour == TOOL_SCALPEL) tool_behaviour = TOOL_SAW - to_chat(user, "You increase the power of [src], now it can cut bones.") + balloon_alert(user, "saw mode") set_light_range(2) force += 1 //we don't want to ruin sharpened stuff - icon_state = "saw_a" + icon_state = "advsaw" else tool_behaviour = TOOL_SCALPEL - to_chat(user, "You lower the power of [src], it can no longer cut bones.") + balloon_alert(user, "scalpel mode") set_light_range(1) force -= 1 - icon_state = "scalpel_a" + icon_state = "advscalpel" /obj/item/scalpel/advanced/examine() . = ..() @@ -306,11 +310,13 @@ /obj/item/retractor/advanced name = "mechanical pinches" - desc = "An ungainly set of rods and gears mounted onto a gauntlet apparatus." + desc = "The innate need for surgeons to show off to their peers has made this wired glove the source of many broken coffee cups." + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + icon_state = "advretractor" + item_state = "advclamps" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - icon_state = "retractor_a" - item_state = "adv_clamps" toolspeed = 0.7 force = 10 //this is in essence a hunk of metal strapped to someone's hand, it's gonna hurt @@ -318,12 +324,12 @@ playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE) if(tool_behaviour == TOOL_RETRACTOR) tool_behaviour = TOOL_HEMOSTAT - to_chat(user, "You configure the gears of [src], they are now in hemostat mode.") - icon_state = "hemostat_a" + balloon_alert(user, "hemostat mode") + icon_state = "advhemostat" else tool_behaviour = TOOL_RETRACTOR - to_chat(user, "You configure the gears of [src], they are now in retractor mode.") - icon_state = "retractor_a" + balloon_alert(user, "retractor mode") + icon_state = "advretractor" /obj/item/retractor/advanced/examine() . = ..() @@ -331,8 +337,11 @@ /obj/item/surgicaldrill/advanced name = "searing tool" - desc = "It projects a high power laser used for medical application." - icon_state = "surgicaldrill_a" + desc = "The hollow central grip allows for a precise, push-dagger holding style. Affectionately referred to as the Kunai by doctors of stealthier inclinations." + icon_state = "advdrill" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + item_state = "advcautery" hitsound = 'sound/items/welder.ogg' toolspeed = 0.7 light_system = MOVABLE_LIGHT @@ -344,12 +353,12 @@ playsound(get_turf(user), 'sound/weapons/tap.ogg', 50, TRUE) if(tool_behaviour == TOOL_DRILL) tool_behaviour = TOOL_CAUTERY - to_chat(user, "You focus the lenses of [src], it is now in mending mode.") - icon_state = "cautery_a" + balloon_alert(user, "cautery mode") + icon_state = "advcautery" else tool_behaviour = TOOL_DRILL - to_chat(user, "You dilate the lenses of [src], it is now in drilling mode.") - icon_state = "surgicaldrill_a" + balloon_alert(user, "drill mode") + icon_state = "advdrill" /obj/item/surgicaldrill/advanced/examine() . = ..() diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index b881662d71cc..666201a32256 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -179,7 +179,7 @@ /datum/tgs_api/v3210/Revision() if(!warned_revison) var/datum/tgs_version/api_version = ApiVersion() - TGS_ERROR_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") + TGS_WARNING_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") warned_revison = TRUE var/datum/tgs_revision_information/ri = new ri.commit = commit diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 2f05c3863380..b9a75c4abb48 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -263,7 +263,12 @@ for(var/I in channels) var/datum/tgs_chat_channel/channel = I ids += channel.id + message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + message = list("message" = message.text, "channelIds" = ids) if(intercepted_message_queue) intercepted_message_queue += list(message) @@ -276,7 +281,12 @@ var/datum/tgs_chat_channel/channel = I if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id + message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + message = list("message" = message.text, "channelIds" = channels) if(intercepted_message_queue) intercepted_message_queue += list(message) diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 6ef7c86ef75b..5d3d491a7362 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.0" +"5.6.1" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 517240f12f8a..926ea10a8f27 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -166,6 +166,10 @@ ids += channel.id message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + message = message._interop_serialize() message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids if(intercepted_message_queue) @@ -181,6 +185,10 @@ channels += channel.id message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + message = message._interop_serialize() message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels if(intercepted_message_queue) @@ -199,6 +207,7 @@ /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() + WaitForReattach(TRUE) return chat_channels.Copy() /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index b3cf77593974..37f58bcdf632 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -59,18 +59,22 @@ var/json = json_encode(data) return json -/datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) +/datum/tgs_api/v5/proc/WaitForReattach(require_channels = FALSE) if(detached) // Wait up to one minute for(var/i in 1 to 600) sleep(1) - if(!detached) + if(!detached && (!require_channels || length(chat_channels))) break - // dad went out for milk cigarettes 20 years ago... + // dad went out for milk and cigarettes 20 years ago... + // yes, this affects all other waiters, intentional if(i == 600) detached = FALSE +/datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) + WaitForReattach(FALSE) + // This is an infinite sleep until we get a response var/export_response = world.Export(bridge_request) if(!export_response) diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 28fcc14aef87..3779db6237a3 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -71,6 +71,7 @@ var/list/event_call = list(event_type) if (event_type == TGS_EVENT_WATCHDOG_DETACH) detached = TRUE + chat_channels.Cut() // https://github.com/tgstation/tgstation-server/issues/1490 if(event_parameters) event_call += event_parameters diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 620bb1e5b47f..c1dfa757d6ee 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -139,32 +139,6 @@ "C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r/unrestricted, "Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted) -/obj/machinery/vending/security/marine/solgov - icon_state = "solgov-marine" - icon_deny = "solgov-marine-deny" - light_mask = "solgov-marine-mask" - icon_vend = "solgov-marine-vend" - req_access = list(ACCESS_SECURITY) - products = list( - /obj/item/restraints/handcuffs = 10, - /obj/item/assembly/flash/handheld = 10, - /obj/item/flashlight/seclite = 10, - /obj/item/reagent_containers/hypospray/combat = 1, - /obj/item/ammo_box/magazine/rifle47x33mm = 5, - /obj/item/ammo_box/magazine/pistol556mm = 10, - /obj/item/stock_parts/cell/gun = 10, - /obj/item/screwdriver/nuke = 5, - /obj/item/grenade/c4 = 5, - /obj/item/grenade/frag = 5, - /obj/item/grenade/flashbang = 5, - /obj/item/grenade/barrier = 10, - /obj/item/melee/transforming/energy/ctf/solgov = 3, - ) - voucher_items = list( - "Tactical Energy Gun" = /obj/item/gun/energy/e_gun/stun, - "SGV \"Solar\" HMG" = /obj/item/gun/ballistic/automatic/hmg/solar, - "TGV \"Swiss Cheese\" Assault Rifle" = /obj/item/gun/ballistic/automatic/assualt/swiss_cheese) - /obj/machinery/vending/security/marine/nanotrasen icon_state = "nt-marine" icon_deny = "nt-marine-deny" @@ -196,11 +170,6 @@ icon_state = "sec-voucher" w_class = WEIGHT_CLASS_TINY //WS end -/obj/item/gun_voucher/solgov - name = "solgov weapon voucher" - desc = "A token used to redeem equipment from your nearest marine vendor." - icon_state = "solgov-voucher" - /obj/item/gun_voucher/syndicate name = "syndicate weapon voucher" desc = "A token used to redeem equipment from your nearest marine vendor." diff --git a/config/motd.txt b/config/motd.txt index 80bd56f0da57..70dcaad610eb 100644 --- a/config/motd.txt +++ b/config/motd.txt @@ -1,5 +1,5 @@ -