mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
fix merge conflict, wipe map changes
This commit is contained in:
@@ -35,9 +35,6 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
var/tctext = input(src, "How much TC do you want to give each team member? Suggested: 20-30. They cannot trade TC.") as num
|
||||
var/tcamount = text2num(tctext)
|
||||
tcamount = between(0, tcamount, 1000)
|
||||
var/spawn_sit_mgmt = 0
|
||||
if(alert("Spawn a syndicate mob for you, so you can brief them before they go?",,"Yes","No")=="Yes")
|
||||
spawn_sit_mgmt = 1
|
||||
if(sent_syndicate_infiltration_team == 1)
|
||||
if(alert("A Syndicate Infiltration Team has already been sent. Sure you want to send another?",,"Yes","No")=="No")
|
||||
return
|
||||
@@ -85,7 +82,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
var/mob/living/carbon/human/new_syndicate_infiltrator = create_syndicate_infiltrator(L, syndicate_leader_selected, tcamount, 0)
|
||||
if(infiltrators.len)
|
||||
var/mob/theguy = pick(infiltrators)
|
||||
if(!spawn_sit_mgmt || theguy.key != key)
|
||||
if(theguy.key != key)
|
||||
new_syndicate_infiltrator.key = theguy.key
|
||||
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
|
||||
new_syndicate_infiltrator.update_action_buttons_icon()
|
||||
@@ -99,7 +96,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
new_syndicate_infiltrator.loc = warpto.loc
|
||||
sit_spawns_leader -= warpto
|
||||
team_leader = new_syndicate_infiltrator
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it. Only your ID opens the exit door.</span>")
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it.</span>")
|
||||
else
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>Your team leader is: [team_leader]. They are in charge!</span>")
|
||||
teamsize--
|
||||
@@ -114,23 +111,6 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
num_spawned++
|
||||
if(!teamsize)
|
||||
break
|
||||
if(spawn_sit_mgmt)
|
||||
for(var/obj/effect/landmark/L in sit_spawns_mgmt)
|
||||
var/mob/living/carbon/human/syndimgmtmob = create_syndicate_infiltrator(L, 1, 100, 1)
|
||||
syndimgmtmob.key = key
|
||||
syndimgmtmob.internal = syndimgmtmob.s_store
|
||||
syndimgmtmob.update_action_buttons_icon()
|
||||
syndimgmtmob.faction += "syndicate"
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite, slot_head)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate, slot_wear_mask)
|
||||
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
|
||||
opshud.join_hud(syndimgmtmob.mind.current)
|
||||
set_antag_hud(syndimgmtmob.mind.current, "hudoperative")
|
||||
syndimgmtmob.mind.special_role = "Syndicate Management Consultant"
|
||||
syndimgmtmob.regenerate_icons()
|
||||
to_chat(syndimgmtmob, "<span class='userdanger'>You have spawned as Syndicate Management. You should brief them on their mission before they go.</span>")
|
||||
message_admins("[key_name_admin(src)] has spawned a Syndicate Infiltration Team.", 1)
|
||||
log_admin("[key_name(src)] used Spawn Syndicate Infiltration Team.")
|
||||
feedback_add_details("admin_verb","SPAWNSIT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -2,25 +2,29 @@
|
||||
set category = "Event"
|
||||
set name = "Unleash Floor Cluwne"
|
||||
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
|
||||
var/target
|
||||
var/mob/living/carbon/human/target
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to release a floor cluwne and kill alot of people?", "Confirm Massacre", "Yes", "No")
|
||||
var/confirm = alert("Are you sure you want to release a floor cluwne and kill a lot of people?", "Confirm Massacre", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
|
||||
if(isnull(target))
|
||||
var/list/potential_targets = list()
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!istype(H))
|
||||
continue
|
||||
if(H.mind.assigned_role == "Cluwne")
|
||||
continue
|
||||
potential_targets += H
|
||||
if(!potential_targets.len) //You're probably the only player on this damn station, spawn it yourself
|
||||
to_chat(src, "<span class='notice'>No valid targets!</span>")
|
||||
return
|
||||
if(target && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
FC.Acquire_Victim(H)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
log_admin("[key_name(usr)] spawned floor cluwne.")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne.")
|
||||
else
|
||||
return
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in potential_targets
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
if(target)
|
||||
FC.Acquire_Victim(target)
|
||||
log_admin("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
|
||||
|
||||
@@ -70,9 +70,6 @@
|
||||
H.dna.SetSEState(JUMPBLOCK, TRUE)
|
||||
genemutcheck(H, JUMPBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
H.dna.SetSEState(SUPERFARTBLOCK, TRUE)
|
||||
genemutcheck(H, SUPERFARTBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
H.dna.SetSEState(IMMOLATEBLOCK, TRUE)
|
||||
genemutcheck(H, IMMOLATEBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
|
||||
for(var/mob/O in hearers(1, loc))
|
||||
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
|
||||
if(!radio_controller)
|
||||
@@ -167,9 +168,9 @@
|
||||
receiving = TRUE
|
||||
|
||||
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
|
||||
..()
|
||||
for(var/obj/effect/anomaly/A in orange(0, src))
|
||||
A.anomalyNeutralize()
|
||||
if(..())
|
||||
for(var/obj/effect/anomaly/A in orange(0, src))
|
||||
A.anomalyNeutralize()
|
||||
|
||||
/obj/item/assembly/signaler/anomaly/attack_self()
|
||||
return
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
origin_tech = "magnets=3;combat=2"
|
||||
var/global/list/jobs[0]
|
||||
HUDType = DATA_HUD_SECURITY_ADVANCED
|
||||
var/read_only = FALSE
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
@@ -114,6 +115,9 @@
|
||||
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
|
||||
prescription_upgradable = 0
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/read_only
|
||||
read_only = TRUE
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses
|
||||
name = "HUDSunglasses"
|
||||
desc = "Sunglasses with a HUD."
|
||||
|
||||
@@ -11,12 +11,15 @@
|
||||
flags_inv = 0
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/user)
|
||||
on = !on
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
|
||||
if(on)
|
||||
set_light(brightness_on)
|
||||
else
|
||||
|
||||
@@ -70,6 +70,11 @@
|
||||
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/head/cueball
|
||||
name = "cueball helmet"
|
||||
@@ -79,6 +84,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/snowman
|
||||
name = "snowman head"
|
||||
@@ -88,6 +97,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/that
|
||||
name = "sturdy top-hat"
|
||||
@@ -246,6 +259,10 @@
|
||||
icon_state = "chickenhead"
|
||||
item_state = "chickensuit"
|
||||
flags = BLOCKHAIR
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/corgi
|
||||
name = "corgi suit head"
|
||||
@@ -396,6 +413,10 @@
|
||||
item_state = "griffinhat"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
actions_types = list(/datum/action/item_action/caw)
|
||||
|
||||
/obj/item/clothing/head/griffin/attack_self()
|
||||
@@ -425,6 +446,10 @@
|
||||
icon_state = "papersack"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE|HIDEEARS
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/papersack/smiley
|
||||
name = "paper sack hat"
|
||||
@@ -432,6 +457,10 @@
|
||||
icon_state = "papersack_smile"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE|HIDEEARS
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/crown
|
||||
name = "crown"
|
||||
@@ -443,3 +472,9 @@
|
||||
name = "magnificent crown"
|
||||
desc = "A crown worn by only the highest emperors of the land."
|
||||
icon_state = "fancycrown"
|
||||
|
||||
/obj/item/clothing/head/zepelli
|
||||
name = "chequered diamond hat"
|
||||
desc = "Wearing this makes you feel like a real mozzarella cheeseball. "
|
||||
icon_state = "zepelli"
|
||||
item_state = "zepelli"
|
||||
@@ -131,6 +131,10 @@
|
||||
flags_inv = HIDEEARS
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
||||
if(src.icon_state == "ushankadown")
|
||||
@@ -154,6 +158,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
brightness_on = 2 //luminosity when on
|
||||
@@ -221,6 +229,11 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_disguise = "High-tech robot"
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
|
||||
..()
|
||||
|
||||
@@ -98,14 +98,13 @@
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
|
||||
var/atom/movable/R = new /obj/item/trash/tapetrash
|
||||
var/turf/T = get_turf(src)
|
||||
R.loc = T
|
||||
transfer_fingerprints_to(R)
|
||||
playsound(src,'sound/items/poster_ripped.ogg',40,1)
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/user)
|
||||
var/obj/item/trash/tapetrash/TT = new(drop_location(src))
|
||||
transfer_fingerprints_to(TT)
|
||||
user.transfer_fingerprints_to(TT)
|
||||
playsound(src, 'sound/items/poster_ripped.ogg', 40, 1)
|
||||
..()
|
||||
user.emote("scream")
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/mask/muzzle/safety
|
||||
name = "safety muzzle"
|
||||
@@ -295,8 +294,10 @@
|
||||
var/voicechange = 0
|
||||
var/temporaryname = " the Horse"
|
||||
var/originalname = ""
|
||||
|
||||
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/horsehead/equipped(mob/user, slot)
|
||||
if(flags & NODROP) //cursed masks only
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/magpulse = 0
|
||||
var/slowdown_active = 2
|
||||
var/slowdown_passive = SHOES_SLOWDOWN
|
||||
var/magpulse_name = "mag-pulse traction system"
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
strip_delay = 70
|
||||
put_on_delay = 70
|
||||
@@ -21,7 +22,7 @@
|
||||
slowdown = slowdown_active
|
||||
magpulse = !magpulse
|
||||
icon_state = "[magboot_state][magpulse]"
|
||||
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.")
|
||||
to_chat(user, "You [magpulse ? "enable" : "disable"] the [magpulse_name].")
|
||||
user.update_inv_shoes() //so our mob-overlays update
|
||||
user.update_gravity(user.mob_has_gravity())
|
||||
for(var/X in actions)
|
||||
@@ -33,7 +34,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/magboots/examine(mob/user)
|
||||
..(user)
|
||||
to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].")
|
||||
to_chat(user, "Its [magpulse_name] appears to be [magpulse ? "enabled" : "disabled"].")
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/magboots/advance
|
||||
@@ -65,7 +66,27 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
slowdown_active = SHOES_SLOWDOWN+1
|
||||
slowdown_passive = SHOES_SLOWDOWN+1
|
||||
magpulse_name = "honk-powered traction system"
|
||||
item_color = "clown"
|
||||
silence_steps = 1
|
||||
shoe_sound = "clownstep"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
|
||||
/obj/item/clothing/shoes/magboots/wizard //bundled with the wiz hardsuit
|
||||
name = "boots of gripping"
|
||||
desc = "These magical boots, once activated, will stay gripped to any surface without slowing you down."
|
||||
icon_state = "wizmag0"
|
||||
magboot_state = "wizmag"
|
||||
slowdown_active = SHOES_SLOWDOWN //wiz hardsuit already slows you down, no need to double it
|
||||
magpulse_name = "gripping ability"
|
||||
|
||||
/obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user)
|
||||
if(user)
|
||||
if(user.mind in ticker.mode.wizards)
|
||||
if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint
|
||||
set_light(0)
|
||||
else
|
||||
set_light(2, 1, LIGHT_COLOR_LIGHTBLUE)
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You poke the gem on [src]. Nothing happens.</span>")
|
||||
@@ -79,7 +79,6 @@
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
item_color = "clown"
|
||||
var/footstep = 1 //used for squeeks whilst walking
|
||||
silence_steps = 1
|
||||
shoe_sound = "clownstep"
|
||||
|
||||
/obj/item/clothing/shoes/jackboots
|
||||
@@ -93,7 +92,6 @@
|
||||
put_on_delay = 50
|
||||
burn_state = FIRE_PROOF
|
||||
var/footstep = 1
|
||||
silence_steps = 1
|
||||
shoe_sound = "jackboot"
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/jacksandals
|
||||
@@ -182,10 +180,10 @@
|
||||
item_state = "noble_boot"
|
||||
|
||||
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/tape_roll))
|
||||
if(istype(I, /obj/item/stack/tape_roll) && !silence_steps)
|
||||
var/obj/item/stack/tape_roll/TR = I
|
||||
if((!silence_steps || shoe_sound) && TR.use(4))
|
||||
silence_steps = 1
|
||||
silence_steps = TRUE
|
||||
shoe_sound = null
|
||||
to_chat(user, "You tape the soles of [src] to silence your footsteps.")
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "chronohelmet"
|
||||
item_state = "chronohelmet"
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
|
||||
armor = list(melee = 60, bullet = 30, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
|
||||
var/obj/item/clothing/suit/space/chronos/suit = null
|
||||
|
||||
/obj/item/clothing/head/helmet/space/chronos/dropped()
|
||||
@@ -208,4 +208,4 @@
|
||||
holder.remote_control = null
|
||||
if(holder.client && (holder.client.eye == src))
|
||||
holder.client.eye = holder
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -99,8 +99,22 @@
|
||||
name = "Santa's hat"
|
||||
desc = "Ho ho ho. Merrry X-mas!"
|
||||
icon_state = "santahat"
|
||||
species_fit = list("Grey, Drask")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/Grey/head.dmi',
|
||||
"Drask" = 'icons/mob/species/Drask/helmet.dmi'
|
||||
)
|
||||
flags = BLOCKHAIR | STOPSPRESSUREDMAGE
|
||||
flags_cover = HEADCOVERSEYES
|
||||
/obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob)
|
||||
if(src.icon_state == "santahat")
|
||||
src.icon_state = "santahat_beard"
|
||||
src.item_state = "santahat_beard"
|
||||
to_chat(user, "Santa's beard expands out from the hat!")
|
||||
else
|
||||
src.icon_state = "santahat"
|
||||
src.item_state = "santahat"
|
||||
to_chat(user, "The beard slinks back into the hat...")
|
||||
|
||||
/obj/item/clothing/suit/space/santa
|
||||
name = "Santa's suit"
|
||||
@@ -165,10 +179,9 @@
|
||||
desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
species_restricted = list("exclude", "Diona", "Wryn")
|
||||
species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
|
||||
species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/suit.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/suit.dmi',
|
||||
|
||||
@@ -9,10 +9,11 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
item_state = "bluetag"
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
allowed = list (/obj/item/gun/energy/laser/bluetag)
|
||||
allowed = list (/obj/item/gun/energy/laser/tag/blue)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
@@ -30,7 +30,7 @@
|
||||
item_state = "redtag"
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
allowed = list (/obj/item/gun/energy/laser/redtag)
|
||||
allowed = list (/obj/item/gun/energy/laser/tag/red)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
@@ -130,7 +131,8 @@
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
|
||||
@@ -247,6 +247,14 @@
|
||||
reqs = list(/obj/item/paper = 5)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/sushimat
|
||||
name = "Sushi Mat"
|
||||
result = /obj/item/kitchen/sushimat
|
||||
time = 10
|
||||
reqs = list(/obj/item/stack/sheet/wood = 1,
|
||||
/obj/item/stack/cable_coil = 2)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/notreallysoap
|
||||
name = "Homemade Soap"
|
||||
result = /obj/item/soap/ducttape
|
||||
@@ -388,4 +396,14 @@
|
||||
/obj/item/stack/rods = 2,
|
||||
/obj/item/assembly/prox_sensor = 1) // Not a timer because the system sees a diamond drill as a drill too, letting you make both otherwise.
|
||||
tools = list(/obj/item/screwdriver, /obj/item/wrench)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/faketoolbox
|
||||
name = "Black and Red toolbox"
|
||||
result = /obj/item/storage/toolbox/fakesyndi
|
||||
time = 40
|
||||
reqs = list(/datum/reagent/paint/red = 10,
|
||||
/datum/reagent/paint/black = 30,
|
||||
/obj/item/storage/toolbox = 1) //Paint in reagents so it doesnt take the container up, yet still take it from the beaker
|
||||
tools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it
|
||||
category = CAT_MISC
|
||||
@@ -514,8 +514,6 @@
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
#undef USED_MOD_HELM
|
||||
#undef USED_MOD_SUIT
|
||||
|
||||
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
|
||||
name = "SG Helmet modkit"
|
||||
@@ -584,8 +582,6 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
#define USED_MOD_HELM 1
|
||||
#define USED_MOD_SUIT 2
|
||||
|
||||
/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber
|
||||
name = "winter sec conversion kit"
|
||||
@@ -639,6 +635,70 @@
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
|
||||
/obj/item/fluff/sylus_conversion_kit //Decemviri: Sylus Cain
|
||||
name = "cerberus pattern conversion kit"
|
||||
desc = "A securirty hardsuit conversion kit."
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/fluff/sylus_conversion_kit/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(istype(target, /obj/item/clothing/head/helmet/space/hardsuit/security))
|
||||
if(used & USED_MOD_HELM)
|
||||
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
|
||||
return
|
||||
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
used |= USED_MOD_HELM
|
||||
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/security/P = target
|
||||
P.name = "cerberus pattern security hardsuit helmet"
|
||||
P.desc = "A special helmet that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty."
|
||||
P.icon = 'icons/obj/custom_items.dmi'
|
||||
P.icon_state = "hardsuit0-secc"
|
||||
P.item_state = "hardsuit0-secc"
|
||||
P.sprite_sheets = null
|
||||
P.item_color = "secc"
|
||||
user.update_icons()
|
||||
|
||||
if(P == H.head)
|
||||
H.update_inv_head()
|
||||
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(target, /obj/item/clothing/suit/space/hardsuit/security))
|
||||
if(used & USED_MOD_SUIT)
|
||||
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
|
||||
return
|
||||
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
used |= USED_MOD_SUIT
|
||||
|
||||
var/obj/item/clothing/suit/space/hardsuit/security/P = target
|
||||
P.name = "cerberus pattern security hardsuit"
|
||||
P.desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty"
|
||||
P.icon = 'icons/obj/custom_items.dmi'
|
||||
P.icon_state = "hardsuit-secc"
|
||||
P.item_state = "hardsuit-secc"
|
||||
P.sprite_sheets = null
|
||||
user.update_icons()
|
||||
|
||||
if(P == H.wear_suit)
|
||||
H.update_inv_wear_suit()
|
||||
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
|
||||
#undef USED_MOD_HELM
|
||||
#undef USED_MOD_SUIT
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
//////////// Clothing ////////////
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -170,6 +170,7 @@ var/list/event_last_fired = list()
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Brand Intelligence", /datum/event/brand_intelligence, 50, list(ASSIGNMENT_ENGINEER = 25), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 50)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Honknomoly", /datum/event/tear/honk, 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/datum/event/carp_migration
|
||||
/datum/event/carp_migration/koi
|
||||
spawned_mobs = list(
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi = 95,
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/honk = 2,
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
density = 0
|
||||
anchored = 1
|
||||
luminosity = 3
|
||||
var/list/tear_critters = list()
|
||||
|
||||
/obj/effect/tear/New()
|
||||
..()
|
||||
@@ -38,10 +39,10 @@
|
||||
animation.master = src
|
||||
// flick("newtear",usr)
|
||||
spawn(15)
|
||||
if(animation) qdel(animation)
|
||||
if(animation)
|
||||
qdel(animation)
|
||||
|
||||
spawn(rand(30,120))
|
||||
var/list/tear_critters = list()
|
||||
for(var/T in typesof(/mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = T
|
||||
if(initial(SA.gold_core_spawnable) == CHEM_MOB_SPAWN_HOSTILE)
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/datum/event/tear/honk
|
||||
var/obj/effect/tear/honk/HE //i could just inherit but its being finicky.
|
||||
|
||||
/datum/event/tear/honk/announce()
|
||||
event_announcement.Announce("A Honknomoly has opened. Expected location: [impact_area.name].", "Honknomoly Alert", 'sound/items/airhorn.ogg')
|
||||
|
||||
/datum/event/tear/honk/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
HE = new /obj/effect/tear/honk(T.loc)
|
||||
|
||||
/datum/event/tear/honk/end()
|
||||
if(HE)
|
||||
qdel(HE)
|
||||
|
||||
/obj/effect/tear/honk
|
||||
name="Honkmensional Tear"
|
||||
desc="A tear in the dimensional fabric of sanity."
|
||||
icon='icons/effects/tear.dmi'
|
||||
icon_state="tear"
|
||||
tear_critters = list(/mob/living/simple_animal/hostile/retaliate/clown/goblin)
|
||||
|
||||
/obj/effect/tear/honk/New()
|
||||
var/atom/movable/overlay/animation = null
|
||||
animation = new(loc)
|
||||
animation.icon_state = "newtear"
|
||||
animation.icon = 'icons/effects/tear.dmi'
|
||||
animation.master = src
|
||||
spawn(15)
|
||||
if(animation)
|
||||
qdel(animation)
|
||||
|
||||
spawn(rand(30,120))
|
||||
|
||||
for(var/i in 1 to 6)
|
||||
var/chosen = pick(tear_critters)
|
||||
var/mob/living/simple_animal/C = new chosen
|
||||
C.forceMove(get_turf(src))
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
@@ -114,6 +114,8 @@
|
||||
reagents.chem_temp += 15
|
||||
to_chat(user, "<span class='notice'>You heat [src] with [I].</span>")
|
||||
reagents.handle_reactions()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/examine(mob/user)
|
||||
if(!..(user, 1))
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"))
|
||||
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/attackby(obj/item/W, mob/user, params)
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/attack_self(mob/user)
|
||||
return
|
||||
|
||||
@@ -55,9 +52,6 @@
|
||||
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
return 1
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params)
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
@@ -88,6 +88,23 @@
|
||||
trash = /obj/item/trash/plate
|
||||
filling_color = "#FADA8E"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/bananacake
|
||||
name = "banana cake"
|
||||
desc = "A cake with added bananas."
|
||||
icon_state = "bananacake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/bananacakeslice
|
||||
slices_num = 5
|
||||
bitesize = 3
|
||||
filling_color = "#FADA8E"
|
||||
list_reagents = list("nutriment" = 20, "vitamin" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/bananacakeslice
|
||||
name = "banana cake slice"
|
||||
desc = "Just a slice of cake, it is enough for everyone."
|
||||
icon_state = "bananacake_slice"
|
||||
trash = /obj/item/trash/plate
|
||||
filling_color = "#FADA8E"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/limecake
|
||||
name = "lime cake"
|
||||
desc = "A cake with added lime."
|
||||
|
||||
@@ -97,6 +97,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
|
||||
name = "Ebi Makiroll"
|
||||
desc = "A large unsliced roll of Ebi Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Ebi_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Ebi
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Ebi
|
||||
name = "Ebi Sushi"
|
||||
desc = "A simple sushi consisting of cooked shrimp and rice."
|
||||
@@ -105,6 +115,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki
|
||||
name = "Ikura Makiroll"
|
||||
desc = "A large unsliced roll of Ikura Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Ikura_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Ikura
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8, "protein" = 4)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Ikura
|
||||
name = "Ikura Sushi"
|
||||
desc = "A simple sushi consisting of salmon roe."
|
||||
@@ -113,6 +133,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2, "protein" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Sake_maki
|
||||
name = "Sake Makiroll"
|
||||
desc = "A large unsliced roll of Ebi Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Sake_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Sake
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Sake
|
||||
name = "Sake Sushi"
|
||||
desc = "A simple sushi consisting of raw salmon and rice."
|
||||
@@ -121,6 +151,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki
|
||||
name = "Smoked Salmon Makiroll"
|
||||
desc = "A large unsliced roll of Smoked Salmon Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "SmokedSalmon_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
|
||||
name = "Smoked Salmon Sushi"
|
||||
desc = "A simple sushi consisting of cooked salmon and rice."
|
||||
@@ -129,6 +169,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tamago_maki
|
||||
name = "Tamago Makiroll"
|
||||
desc = "A large unsliced roll of Tamago Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tamago_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tamago
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Tamago
|
||||
name = "Tamago Sushi"
|
||||
desc = "A simple sushi consisting of egg and rice."
|
||||
@@ -137,6 +187,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Inari_maki
|
||||
name = "Inari Makiroll"
|
||||
desc = "A large unsliced roll of Inari Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Inari_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Inari
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Inari
|
||||
name = "Inari Sushi"
|
||||
desc = "A piece of fried tofu stuffed with rice."
|
||||
@@ -145,6 +205,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Masago_maki
|
||||
name = "Masago Makiroll"
|
||||
desc = "A large unsliced roll of Masago Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Masago_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Masago
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8, "protein" = 4)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Masago
|
||||
name = "Masago Sushi"
|
||||
desc = "A simple sushi consisting of goldfish roe."
|
||||
@@ -153,6 +223,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2, "protein" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki
|
||||
name = "Tobiko Makiroll"
|
||||
desc = "A large unsliced roll of Tobkio Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tobiko_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tobiko
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8, "protein" = 4)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Tobiko
|
||||
name = "Tobiko Sushi"
|
||||
desc = "A simple sushi consisting of shark roe."
|
||||
@@ -161,6 +241,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2, "protein" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
|
||||
name = "Tobiko and Egg Makiroll"
|
||||
desc = "A large unsliced roll of Tobkio and Egg Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "TobikoEgg_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8, "protein" = 4)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
|
||||
name = "Tobiko and Egg Sushi"
|
||||
desc = "A sushi consisting of shark roe and an egg."
|
||||
@@ -169,6 +259,16 @@
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 2, "protein" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
|
||||
name = "Tai Makiroll"
|
||||
desc = "A large unsliced roll of Tai Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tai_maki"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tai
|
||||
slices_num = 4
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Tai
|
||||
name = "Tai Sushi"
|
||||
desc = "A simple sushi consisting of catfish and rice."
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
if(istype(W,/obj/item/storage))
|
||||
..() // -> item/attackby(, params)
|
||||
|
||||
if(istype(W,/obj/item/kitchen/utensil))
|
||||
else if(istype(W,/obj/item/kitchen/utensil))
|
||||
|
||||
var/obj/item/kitchen/utensil/U = W
|
||||
|
||||
@@ -116,6 +116,8 @@
|
||||
TrashItem.forceMove(loc)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location)
|
||||
if(trash)
|
||||
|
||||
@@ -355,6 +355,17 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/orangecake
|
||||
|
||||
/datum/recipe/oven/bananacake
|
||||
reagents = list("milk" = 5)
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/bananacake
|
||||
|
||||
/datum/recipe/oven/limecake
|
||||
reagents = list("milk" = 5)
|
||||
items = list(
|
||||
|
||||
@@ -82,6 +82,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Ebi
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Ebi_maki
|
||||
name = "Ebi Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/boiled_shrimp = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Ikura
|
||||
name = "Ikura Sushi"
|
||||
reqs = list(
|
||||
@@ -91,6 +101,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Ikura
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Ikura_maki
|
||||
name = "Ikura Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/fish_eggs/salmon = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Inari
|
||||
name = "Inari Sushi"
|
||||
reqs = list(
|
||||
@@ -100,6 +120,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Inari
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Inari_maki
|
||||
name = "Inari Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/fried_tofu = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Inari_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Sake
|
||||
name = "Sake Sushi"
|
||||
reqs = list(
|
||||
@@ -109,6 +139,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Sake
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Sake_maki
|
||||
name = "Sake Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/salmonmeat = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Sake_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_SmokedSalmon
|
||||
name = "Smoked Salmon Sushi"
|
||||
reqs = list(
|
||||
@@ -118,6 +158,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/SmokedSalmon_maki
|
||||
name = "Smoked Salmon Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/salmonsteak = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Masago
|
||||
name = "Masago Sushi"
|
||||
reqs = list(
|
||||
@@ -127,6 +177,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Masago
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Masago_maki
|
||||
name = "Masago Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/fish_eggs/goldfish = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Masago_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Tobiko
|
||||
name = "Tobiko Sushi"
|
||||
reqs = list(
|
||||
@@ -136,6 +196,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Tobiko
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Tobiko_maki
|
||||
name = "Tobiko Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/fish_eggs/shark = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_TobikoEgg
|
||||
name = "Tobiko and Egg Sushi"
|
||||
reqs = list(
|
||||
@@ -145,6 +215,26 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/TobikoEgg_maki
|
||||
name = "Tobiko Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4,
|
||||
/obj/item/reagent_containers/food/snacks/egg = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Sake_maki
|
||||
name = "Sake Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4,
|
||||
/obj/item/reagent_containers/food/snacks/egg = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/sushi_Tai
|
||||
name = "Tai Sushi"
|
||||
reqs = list(
|
||||
@@ -153,3 +243,13 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Tai
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/Tai_maki
|
||||
name = "Tai Makiroll"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/catfishmeat = 4,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
|
||||
category = CAT_FOOD
|
||||
@@ -6,6 +6,10 @@
|
||||
new /obj/item/a_gift(T)
|
||||
for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in GLOB.mob_list)
|
||||
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
|
||||
//The following spawn is necessary as both the timer and the shuttle systems initialise after the events system does, so we can't add stuff to the shuttle system as it doesn't exist yet and we can't use a timer
|
||||
spawn(60 SECONDS)
|
||||
var/datum/supply_packs/xmas = SSshuttle.supply_packs["[/datum/supply_packs/misc/snow_machine]"]
|
||||
xmas.special_enabled = TRUE
|
||||
|
||||
/datum/holiday/xmas/handle_event()
|
||||
spawnTree()
|
||||
|
||||
@@ -845,9 +845,10 @@
|
||||
to_chat(user, "<span class='info'>[src] is only effective on lesser beings.</span>")
|
||||
return
|
||||
|
||||
/obj/item/lazarus_injector/emag_act()
|
||||
/obj/item/lazarus_injector/emag_act(mob/user)
|
||||
if(!malfunctioning)
|
||||
malfunctioning = 1
|
||||
to_chat(user, "<span class='notice'>You override [src]'s safety protocols.</span>")
|
||||
|
||||
/obj/item/lazarus_injector/emp_act()
|
||||
if(!malfunctioning)
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
/mob/camera
|
||||
name = "camera mob"
|
||||
density = 0
|
||||
anchored = 1
|
||||
move_force = INFINITY
|
||||
move_resist = INFINITY
|
||||
status_flags = GODMODE // You can't damage it.
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
see_in_dark = 7
|
||||
|
||||
@@ -3,3 +3,6 @@
|
||||
|
||||
/mob/dead/gib() //ghosts can't be gibbed.
|
||||
return
|
||||
|
||||
/mob/dead
|
||||
move_resist = INFINITY
|
||||
@@ -13,7 +13,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
|
||||
density = 0
|
||||
canmove = 0
|
||||
alpha = 127
|
||||
anchored = 1 // don't get pushed around
|
||||
move_resist = INFINITY // don't get pushed around
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
var/can_reenter_corpse
|
||||
var/bootime = 0
|
||||
@@ -706,6 +706,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set name = "Mob spawners menu"
|
||||
set desc = "See all currently available ghost spawners"
|
||||
set category = "Ghost"
|
||||
|
||||
|
||||
var/datum/spawners_menu/menu = new /datum/spawners_menu(src)
|
||||
menu.ui_interact(src)
|
||||
|
||||
@@ -58,6 +58,16 @@
|
||||
)
|
||||
autohiss_exempt = list("Chittin")
|
||||
|
||||
/datum/species/drask
|
||||
autohiss_basic_map = list(
|
||||
"o" = list ("oo", "ooo"),
|
||||
"u" = list ("uu", "uuu")
|
||||
)
|
||||
autohiss_extra_map = list(
|
||||
"m" = list ("mm", "mmm")
|
||||
)
|
||||
autohiss_exempt = list("Orluum")
|
||||
|
||||
|
||||
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
|
||||
if(!autohiss_basic_map)
|
||||
|
||||
@@ -171,11 +171,11 @@
|
||||
//Lasertag bullshit
|
||||
if(lasercolor)
|
||||
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/gun/energy/laser/redtag)))
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/tag/red)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/red)))
|
||||
threatcount += 4
|
||||
|
||||
if(lasercolor == "r")
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/gun/energy/laser/bluetag)))
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/tag/blue)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/blue)))
|
||||
threatcount += 4
|
||||
|
||||
return threatcount
|
||||
|
||||
@@ -574,7 +574,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
if(thrown_thing)
|
||||
visible_message("<span class='danger'>[src] has thrown [thrown_thing].</span>")
|
||||
newtonian_move(get_dir(target, src))
|
||||
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
|
||||
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force)
|
||||
|
||||
/mob/living/carbon/can_use_hands()
|
||||
if(handcuffed)
|
||||
|
||||
@@ -832,11 +832,7 @@
|
||||
message = "<span class='danger'><b>[src]</b> snaps [p_their()] fingers right off!</span>"
|
||||
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
|
||||
// Needed for M_TOXIC_FART
|
||||
if("fart", "farts")
|
||||
if(reagents.has_reagent("simethicone"))
|
||||
return
|
||||
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
|
||||
if(locate(/obj/item/storage/bible) in get_turf(src))
|
||||
to_chat(viewers(src), "<span class='danger'>[src] farts on the Bible!</span>")
|
||||
var/image/cross = image('icons/obj/storage.dmi', "bible")
|
||||
@@ -844,29 +840,10 @@
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_EVENT, 0, X.mob))
|
||||
to_chat(X, adminbfmessage)
|
||||
else if(TOXIC_FARTS in mutations)
|
||||
message = "<b>[src]</b> unleashes a [pick("horrible", "terrible", "foul", "disgusting", "awful")] fart."
|
||||
else if(SUPER_FART in mutations)
|
||||
message = "<b>[src]</b> unleashes a [pick("loud", "deafening")] fart."
|
||||
else
|
||||
message = "<b>[src]</b> [pick("passes wind", "farts")]."
|
||||
m_type = 2
|
||||
|
||||
var/turf/location = get_turf(src)
|
||||
|
||||
// Process toxic farts first.
|
||||
if(TOXIC_FARTS in mutations)
|
||||
for(var/mob/living/carbon/C in range(location, 2))
|
||||
if(C.internal != null && C.wear_mask && (C.wear_mask.flags & AIRTIGHT))
|
||||
continue
|
||||
if(C == src)
|
||||
continue
|
||||
C.reagents.add_reagent("jenkem", 1)
|
||||
|
||||
// Farting as a form of locomotion in space
|
||||
if(SUPER_FART in mutations)
|
||||
newtonian_move(dir)
|
||||
|
||||
if("hem")
|
||||
message = "<b>[src]</b> hems."
|
||||
|
||||
|
||||
@@ -363,8 +363,8 @@
|
||||
for(var/datum/data/record/R in data_core.security)
|
||||
if(R.fields["id"] == E.fields["id"])
|
||||
criminal = R.fields["criminal"]
|
||||
|
||||
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=[UID()];criminal=1'>\[[criminal]\]</a>\n"
|
||||
var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "<a href='?src=[UID()];criminal=[glasses]'>\[[criminal]\]</a>"
|
||||
msg += "<span class = 'deptradio'>Criminal status:</span> [criminal_status]\n"
|
||||
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=[UID()];secrecord=`'>\[View\]</a> <a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>\n"
|
||||
|
||||
if(hasHUD(user,"medical"))
|
||||
@@ -408,7 +408,12 @@
|
||||
var/obj/item/organ/internal/cyberimp/eyes/hud/CIH = H.get_int_organ(/obj/item/organ/internal/cyberimp/eyes/hud)
|
||||
switch(hudtype)
|
||||
if("security")
|
||||
return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
|
||||
return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
|
||||
if("read_only_security")
|
||||
var/obj/item/clothing/glasses/hud/security/S
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
|
||||
S = H.glasses
|
||||
return !istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security) && S && S.read_only
|
||||
if("medical")
|
||||
return istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.glasses, /obj/item/clothing/glasses/hud/health/health_advanced) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical)
|
||||
else
|
||||
|
||||
@@ -1567,17 +1567,17 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
|
||||
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/redtag))
|
||||
threatcount += 4
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/gun/energy/laser/redtag)))
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/tag/red)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/red)))
|
||||
threatcount += 4
|
||||
if(istype(belt, /obj/item/gun/energy/laser/redtag))
|
||||
if(istype(belt, /obj/item/gun/energy/laser/tag/red))
|
||||
threatcount += 2
|
||||
|
||||
if(lasercolor == "r")
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/bluetag))
|
||||
threatcount += 4
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/gun/energy/laser/bluetag)))
|
||||
if((istype(r_hand,/obj/item/gun/energy/laser/tag/blue)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/blue)))
|
||||
threatcount += 4
|
||||
if(istype(belt, /obj/item/gun/energy/laser/bluetag))
|
||||
if(istype(belt, /obj/item/gun/energy/laser/tag/blue))
|
||||
threatcount += 2
|
||||
|
||||
return threatcount
|
||||
|
||||
@@ -85,6 +85,13 @@
|
||||
if(!(step_count % 2)) //every other turf makes a sound
|
||||
return 0
|
||||
|
||||
if(istype(shoes, /obj/item/clothing/shoes))
|
||||
var/obj/item/clothing/shoes/shooess = shoes
|
||||
if(shooess.silence_steps)
|
||||
return 0 //silent
|
||||
if(shooess.shoe_sound)
|
||||
return //Handle it on the shoe
|
||||
|
||||
var/range = -(world.view - 2)
|
||||
if(m_intent == MOVE_INTENT_WALK)
|
||||
range -= 0.333
|
||||
@@ -104,11 +111,6 @@
|
||||
if(!shoes)
|
||||
volume -= 4
|
||||
|
||||
if(istype(shoes, /obj/item/clothing/shoes))
|
||||
var/obj/item/clothing/shoes/shooess = shoes
|
||||
if(shooess.silence_steps)
|
||||
return 0 //silent
|
||||
|
||||
if(!has_organ("l_foot") && !has_organ("r_foot"))
|
||||
return 0 //no feet no footsteps
|
||||
|
||||
|
||||
@@ -156,6 +156,9 @@
|
||||
// Mutant pieces
|
||||
var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears
|
||||
|
||||
// Species specific boxes
|
||||
var/speciesbox
|
||||
|
||||
/datum/species/New()
|
||||
//If the species has eyes, they are the default vision organ
|
||||
if(!vision_organ && has_organ["eyes"])
|
||||
|
||||
@@ -17,4 +17,5 @@
|
||||
worlds tumultous at best."
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
//Has standard darksight of 2.
|
||||
//Has standard darksight of 2.
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
"eyes" = /obj/item/organ/internal/eyes
|
||||
)
|
||||
|
||||
speciesbox = /obj/item/storage/box/survival_plasmaman
|
||||
|
||||
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = replacetext(message, "s", stutter("ss"))
|
||||
@@ -146,6 +148,9 @@
|
||||
if("Mime")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
|
||||
if("Syndicate Officer")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/nuclear
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
|
||||
|
||||
if((H.mind.special_role == SPECIAL_ROLE_WIZARD) || (H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))
|
||||
H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/wizard(H), slot_wear_suit)
|
||||
|
||||
@@ -78,6 +78,8 @@
|
||||
"is holding their breath!",
|
||||
"is deeply inhaling oxygen!")
|
||||
|
||||
speciesbox = /obj/item/storage/box/survival_vox
|
||||
|
||||
/datum/species/vox/handle_death(mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
|
||||
|
||||
@@ -9,13 +9,15 @@
|
||||
var/class
|
||||
var/list/default_genes = list(REGEN, BREATHLESS, COLDRES)
|
||||
var/list/default_spells = list()
|
||||
|
||||
var/activated = FALSE //for wishgranters to not give an option if someone already has it.
|
||||
|
||||
/datum/superheroes/proc/create(var/mob/living/carbon/human/H)
|
||||
assign_genes(H)
|
||||
assign_spells(H)
|
||||
equip(H)
|
||||
fixflags(H)
|
||||
assign_id(H)
|
||||
H.mind.special_role = SPECIAL_ROLE_SUPER
|
||||
|
||||
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
|
||||
H.rename_character(H.real_name, name)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
if(ObjBump(A))
|
||||
return
|
||||
if(istype(A, /atom/movable))
|
||||
if(PushAM(A))
|
||||
if(PushAM(A, move_force))
|
||||
return
|
||||
|
||||
//Called when we bump into a mob
|
||||
@@ -127,32 +127,41 @@
|
||||
return
|
||||
|
||||
//Called when we want to push an atom/movable
|
||||
/mob/living/proc/PushAM(atom/movable/AM)
|
||||
/mob/living/proc/PushAM(atom/movable/AM, force = move_force)
|
||||
if(now_pushing)
|
||||
return 1
|
||||
return TRUE
|
||||
if(moving_diagonally) // no pushing during diagonal moves
|
||||
return 1
|
||||
return TRUE
|
||||
if(!client && (mob_size < MOB_SIZE_SMALL))
|
||||
return
|
||||
if(!AM.anchored)
|
||||
now_pushing = 1
|
||||
var/t = get_dir(src, AM)
|
||||
if(istype(AM, /obj/structure/window))
|
||||
var/obj/structure/window/W = AM
|
||||
if(W.fulltile)
|
||||
for(var/obj/structure/window/win in get_step(W, t))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
var/current_dir
|
||||
if(isliving(AM))
|
||||
current_dir = AM.dir
|
||||
step(AM, t)
|
||||
if(current_dir)
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = 0
|
||||
|
||||
now_pushing = TRUE
|
||||
var/t = get_dir(src, AM)
|
||||
var/push_anchored = FALSE
|
||||
if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force)
|
||||
if(move_crush(AM, move_force, t))
|
||||
push_anchored = TRUE
|
||||
if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
|
||||
if(force_push(AM, move_force, t, push_anchored))
|
||||
push_anchored = TRUE
|
||||
if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO)))
|
||||
now_pushing = FALSE
|
||||
return
|
||||
if(istype(AM, /obj/structure/window))
|
||||
var/obj/structure/window/W = AM
|
||||
if(W.fulltile)
|
||||
for(var/obj/structure/window/win in get_step(W,t))
|
||||
now_pushing = FALSE
|
||||
return
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
var/current_dir
|
||||
if(isliving(AM))
|
||||
current_dir = AM.dir
|
||||
if(step(AM, t))
|
||||
step(src, t)
|
||||
if(current_dir)
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = FALSE
|
||||
|
||||
/mob/living/Stat()
|
||||
. = ..()
|
||||
@@ -187,9 +196,20 @@
|
||||
set name = "Pull"
|
||||
set category = "Object"
|
||||
|
||||
if(AM.Adjacent(src))
|
||||
if(istype(AM) && Adjacent(AM))
|
||||
start_pulling(AM)
|
||||
return
|
||||
else
|
||||
stop_pulling()
|
||||
|
||||
/mob/living/stop_pulling()
|
||||
..()
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
|
||||
/mob/living/verb/stop_pulling1()
|
||||
set name = "Stop Pulling"
|
||||
set category = "IC"
|
||||
stop_pulling()
|
||||
|
||||
//same as above
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
@@ -852,6 +872,37 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
|
||||
if(!AM || !src)
|
||||
return FALSE
|
||||
if(!(AM.can_be_pulled(src, state, force)))
|
||||
return FALSE
|
||||
if(incapacitated())
|
||||
return
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
AM.add_fingerprint(src)
|
||||
if(pulling)
|
||||
if(AM == pulling)// Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
|
||||
return
|
||||
stop_pulling()
|
||||
if(AM.pulledby)
|
||||
visible_message("<span class='danger'>[src] has pulled [AM] from [AM.pulledby]'s grip.</span>")
|
||||
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
|
||||
pulling = AM
|
||||
AM.pulledby = src
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
/mob/living/proc/check_pull()
|
||||
if(pulling && !(pulling in orange(1)))
|
||||
stop_pulling()
|
||||
|
||||
/mob/living/proc/get_taste_sensitivity()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
return 0
|
||||
|
||||
//this proc handles being hit by a thrown atom
|
||||
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)//Standardization and logging -Sieve
|
||||
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0, datum/thrownthing/throwingdatum)//Standardization and logging -Sieve
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
// End BS12 momentum-transfer code.
|
||||
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0)
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE)
|
||||
if(user == src || anchored)
|
||||
return 0
|
||||
if(!(status_flags & CANPUSH))
|
||||
|
||||
@@ -38,7 +38,7 @@ var/list/ai_verbs_default = list(
|
||||
name = "AI"
|
||||
icon = 'icons/mob/AI.dmi'//
|
||||
icon_state = "ai"
|
||||
anchored = 1 // -- TLE
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
density = 1
|
||||
status_flags = CANSTUN|CANPARALYSE|CANPUSH
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
@@ -533,9 +533,14 @@ var/list/ai_verbs_default = list(
|
||||
if(!isturf(loc)) // if their location isn't a turf
|
||||
return // stop
|
||||
|
||||
anchored = !anchored // Toggles the anchor
|
||||
var/is_anchored = FALSE
|
||||
if(move_resist == MOVE_FORCE_VERY_STRONG)
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
else
|
||||
is_anchored = TRUE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
|
||||
to_chat(src, "[anchored ? "<b>You are now anchored.</b>" : "<b>You are now unanchored.</b>"]")
|
||||
to_chat(src, "[is_anchored ? "<b>You are now anchored.</b>" : "<b>You are now unanchored.</b>"]")
|
||||
|
||||
/mob/living/silicon/ai/update_canmove()
|
||||
return FALSE
|
||||
@@ -656,7 +661,21 @@ var/list/ai_verbs_default = list(
|
||||
return
|
||||
|
||||
if(href_list["ai_take_control"]) //Mech domination
|
||||
|
||||
var/obj/mecha/M = locate(href_list["ai_take_control"])
|
||||
|
||||
if(!M)
|
||||
return
|
||||
|
||||
var/mech_has_controlbeacon = FALSE
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in M.trackers)
|
||||
mech_has_controlbeacon = TRUE
|
||||
break
|
||||
if(!can_dominate_mechs && !mech_has_controlbeacon)
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
|
||||
return
|
||||
|
||||
if(controlled_mech)
|
||||
to_chat(src, "<span class='warning'>You are already loaded into an onboard computer!</span>")
|
||||
return
|
||||
@@ -670,7 +689,7 @@ var/list/ai_verbs_default = list(
|
||||
to_chat(src, "<span class='warning'>You aren't in your core!</span>")
|
||||
return
|
||||
if(M)
|
||||
M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
|
||||
M.transfer_ai(AI_MECH_HACK, src, usr) //Called om the mech itself.
|
||||
|
||||
else if(href_list["faketrack"])
|
||||
var/mob/target = locate(href_list["track"]) in GLOB.mob_list
|
||||
|
||||
@@ -517,12 +517,8 @@
|
||||
/mob/living/silicon/pai/Bumped()
|
||||
return
|
||||
|
||||
/mob/living/silicon/pai/start_pulling(var/atom/movable/AM)
|
||||
if(stat || sleeping || paralysis || weakened)
|
||||
return
|
||||
if(istype(AM,/obj/item))
|
||||
to_chat(src, "<span class='warning'>You are far too small to pull anything!</span>")
|
||||
return
|
||||
/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/update_canmove(delay_action_updates = 0)
|
||||
. = ..()
|
||||
|
||||
@@ -23,24 +23,22 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min]
|
||||
|
||||
/datum/paiController/Topic(href, href_list[])
|
||||
if("signup" in href_list)
|
||||
var/mob/dead/observer/O = locate(href_list["signup"])
|
||||
if(!O) return
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
to_chat(O, "You've given up your ability to respawn!")
|
||||
|
||||
var/datum/paiCandidate/candidate = locateUID(href_list["candidate"])
|
||||
|
||||
if(candidate)
|
||||
if(!istype(candidate))
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)")
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)")
|
||||
return
|
||||
if(!check_recruit(O)) return
|
||||
recruitWindow(O)
|
||||
return
|
||||
|
||||
if(href_list["download"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/obj/item/paicard/card = locate(href_list["device"])
|
||||
if(card.pai)
|
||||
return
|
||||
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
|
||||
return
|
||||
if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate))
|
||||
if(istype(card, /obj/item/paicard) && istype(candidate, /datum/paiCandidate))
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
if(!candidate.name)
|
||||
pai.name = pick(GLOB.ninja_names)
|
||||
@@ -58,8 +56,27 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
pai_candidates -= candidate
|
||||
usr << browse(null, "window=findPai")
|
||||
|
||||
|
||||
if(candidate)
|
||||
if(candidate.key && usr.key && candidate.key != usr.key)
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
|
||||
return
|
||||
|
||||
if("signup" in href_list)
|
||||
var/mob/dead/observer/O = locate(href_list["signup"])
|
||||
if(!O)
|
||||
return
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
to_chat(O, "You've given up your ability to respawn!")
|
||||
return
|
||||
if(!check_recruit(O))
|
||||
return
|
||||
recruitWindow(O)
|
||||
return
|
||||
|
||||
|
||||
if(href_list["new"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/option = href_list["option"]
|
||||
var/t = ""
|
||||
|
||||
@@ -183,28 +200,28 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
|
||||
<table>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=\ref[candidate]'>Name</a>:</th>
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=[candidate.UID()]'>Name</a>:</th>
|
||||
<td class="desc">[candidate.name] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=desc;new=1;candidate=\ref[candidate]'>Description</a>:</th>
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=desc;new=1;candidate=[candidate.UID()]'>Description</a>:</th>
|
||||
<td class="desc">[candidate.description] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=role;new=1;candidate=\ref[candidate]'>Preferred Role</a>:</th>
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=role;new=1;candidate=[candidate.UID()]'>Preferred Role</a>:</th>
|
||||
<td class="desc">[candidate.role] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=\ref[candidate]'>OOC Comments</a>:</th>
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=[candidate.UID()]'>OOC Comments</a>:</th>
|
||||
<td class="desc">[candidate.comments] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
@@ -215,17 +232,17 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
<table>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=save;new=1;candidate=\ref[candidate]' class="button">Save Personality</a>
|
||||
<a href='byond://?src=[UID()];option=save;new=1;candidate=[candidate.UID()]' class="button">Save Personality</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=load;new=1;candidate=\ref[candidate]' class="button">Load Personality</a>
|
||||
<a href='byond://?src=[UID()];option=load;new=1;candidate=[candidate.UID()]' class="button">Load Personality</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br>
|
||||
<table>
|
||||
<td class="button"><a href='byond://?src=[UID()];option=submit;new=1;candidate=\ref[candidate]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
|
||||
<td class="button"><a href='byond://?src=[UID()];option=submit;new=1;candidate=[candidate.UID()]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
|
||||
</table><br>
|
||||
|
||||
</body>
|
||||
@@ -336,7 +353,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
</tr>
|
||||
</table>
|
||||
<table class="download">
|
||||
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=\ref[c];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
|
||||
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=[c.UID()];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
|
||||
</td>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
@@ -153,11 +153,11 @@
|
||||
var/newname = ""
|
||||
switch(lasercolor)
|
||||
if("b")
|
||||
if(!istype(W, /obj/item/gun/energy/laser/bluetag))
|
||||
if(!istype(W, /obj/item/gun/energy/laser/tag/blue))
|
||||
return
|
||||
newname = "bluetag ED-209 assembly"
|
||||
if("r")
|
||||
if(!istype(W, /obj/item/gun/energy/laser/redtag))
|
||||
if(!istype(W, /obj/item/gun/energy/laser/tag/red))
|
||||
return
|
||||
newname = "redtag ED-209 assembly"
|
||||
if("")
|
||||
|
||||
@@ -23,12 +23,13 @@
|
||||
path_image_color = "#FF0000"
|
||||
data_hud_type = DATA_HUD_SECURITY_ADVANCED
|
||||
|
||||
allow_pai = 0
|
||||
|
||||
var/lastfired = 0
|
||||
var/shot_delay = 3 //.3 seconds between shots
|
||||
var/lasercolor = ""
|
||||
var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag
|
||||
|
||||
|
||||
var/mob/living/carbon/target
|
||||
var/oldtarget_name
|
||||
var/threatlevel = 0
|
||||
@@ -41,10 +42,9 @@
|
||||
var/arrest_type = 0 //If true, don't handcuff
|
||||
var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type
|
||||
var/shoot_sound = 'sound/weapons/Taser.ogg'
|
||||
allow_pai = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/New(loc,created_name,created_lasercolor)
|
||||
/mob/living/simple_animal/bot/ed209/New(loc, created_name, created_lasercolor)
|
||||
..()
|
||||
if(created_name)
|
||||
name = created_name
|
||||
@@ -52,29 +52,33 @@
|
||||
lasercolor = created_lasercolor
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
set_weapon() //giving it the right projectile and firing sound.
|
||||
spawn(3)
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
setup_access()
|
||||
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
declare_arrests = 0 // Don't spam sec
|
||||
bot_core.req_access = list(access_maint_tunnels, access_theatre, access_robotics)
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
declare_arrests = 0 // Don't spam sec
|
||||
bot_core.req_access = list(access_maint_tunnels, access_theatre, access_robotics)
|
||||
|
||||
if(created_name == initial(name) || !created_name)
|
||||
if(lasercolor == "b")
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
else if (lasercolor == "r")
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
if(created_name == initial(name) || !created_name)
|
||||
if(lasercolor == "b")
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
else if (lasercolor == "r")
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
|
||||
//SECHUD
|
||||
var/datum/atom_hud/secsensor = huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
secsensor.add_hud_to(src)
|
||||
permanent_huds |= secsensor
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/setup_access()
|
||||
if(access_card)
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/turn_on()
|
||||
. = ..()
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
@@ -383,11 +387,11 @@
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "b")
|
||||
var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
|
||||
var/obj/item/gun/energy/laser/tag/blue/G = new /obj/item/gun/energy/laser/tag/blue(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "r")
|
||||
var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
|
||||
var/obj/item/gun/energy/laser/tag/red/G = new /obj/item/gun/energy/laser/tag/red(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
|
||||
@@ -412,7 +416,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
|
||||
shoot_sound = 'sound/weapons/laser.ogg'
|
||||
shoot_sound = 'sound/weapons/Laser.ogg'
|
||||
if(emagged == 2)
|
||||
if(lasercolor)
|
||||
projectile = /obj/item/projectile/beam/disabler
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
desc = "A Multiple Utility Load Effector bot."
|
||||
icon_state = "mulebot0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
animate_movement=1
|
||||
move_resist = MOVE_FORCE_STRONG
|
||||
animate_movement = 1
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
|
||||
@@ -29,12 +29,14 @@
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/New()
|
||||
..()
|
||||
if(access_card)
|
||||
access_card.access = list(access_syndicate, access_syndicate_leader)
|
||||
set_weapon()
|
||||
update_icon()
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/setup_access()
|
||||
if(access_card)
|
||||
access_card.access = list(access_syndicate, access_syndicate_leader)
|
||||
prev_access = access_card.access
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
@@ -160,7 +162,7 @@
|
||||
P.fire()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/explode()
|
||||
if (!QDELETED(src))
|
||||
if(!QDELETED(src))
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
walk_to(src,0)
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
speak = list("Squeek!","SQUEEK!","Squeek?")
|
||||
speak_emote = list("squeeks","squeeks","squiks")
|
||||
speak_emote = list("squeeks","squeaks","squiks")
|
||||
emote_hear = list("squeeks","squeaks","squiks")
|
||||
emote_see = list("runs in a circle", "shakes", "scritches at something")
|
||||
var/squeak_sound = 'sound/effects/mousesqueek.ogg'
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
@@ -40,7 +41,7 @@
|
||||
..()
|
||||
if(prob(speak_chance))
|
||||
for(var/mob/M in view())
|
||||
M << 'sound/effects/mousesqueek.ogg'
|
||||
M << squeak_sound
|
||||
|
||||
/mob/living/simple_animal/mouse/Life(seconds, times_fired)
|
||||
. = ..()
|
||||
@@ -71,6 +72,7 @@
|
||||
desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
playsound(src, squeak_sound, 40, 1)
|
||||
src.health = 0
|
||||
src.stat = DEAD
|
||||
src.icon_dead = "mouse_[mouse_color]_splat"
|
||||
@@ -93,7 +95,7 @@
|
||||
if(stat == CONSCIOUS)
|
||||
var/mob/M = AM
|
||||
to_chat(M, "<span class='notice'>[bicon(src)] Squeek!</span>")
|
||||
SEND_SOUND(M, 'sound/effects/mousesqueek.ogg')
|
||||
SEND_SOUND(M, squeak_sound)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/mouse/death(gibbed)
|
||||
@@ -105,6 +107,31 @@
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
|
||||
/mob/living/simple_animal/mouse/emote(act, m_type=1, message = null)
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if("squeak") //Mouse time
|
||||
on_CD = handle_emote_CD()
|
||||
else
|
||||
on_CD = 0
|
||||
|
||||
if(on_CD == 1)
|
||||
return
|
||||
|
||||
switch(act)
|
||||
if("squeak")
|
||||
message = "<B>\The [src]</B> squeaks!"
|
||||
m_type = 2 //audible
|
||||
playsound(src, squeak_sound, 40, 1)
|
||||
if("help")
|
||||
to_chat(src, "scream, squeak")
|
||||
|
||||
..()
|
||||
|
||||
/*
|
||||
* Mouse types
|
||||
*/
|
||||
|
||||
@@ -71,15 +71,18 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Life(seconds, times_fired)
|
||||
if(current_victim && !ishuman(current_victim)) //Just in case a nonhuman is accidentally chosen. A human will then be chosen later on in Acquire_Victim()
|
||||
current_victim = null
|
||||
|
||||
do_jitter_animation(1000)
|
||||
pixel_y = 8
|
||||
|
||||
if(is_type_in_typecache(get_area(src.loc), invalid_area_typecache))
|
||||
if(is_type_in_typecache(get_area(loc), invalid_area_typecache))
|
||||
var/area = pick(teleportlocs)
|
||||
var/area/tp = teleportlocs[area]
|
||||
forceMove(pick(get_area_turfs(tp.type)))
|
||||
|
||||
if(!current_victim && !admincluwne)
|
||||
if((!current_victim && !admincluwne) || QDELETED(current_victim))
|
||||
Acquire_Victim()
|
||||
|
||||
if(stage && !manifested)
|
||||
@@ -147,24 +150,25 @@
|
||||
var/list/players_copy = GLOB.player_list.Copy()
|
||||
while(players_copy.len)
|
||||
var/mob/living/carbon/human/H = pick_n_take(players_copy)
|
||||
if(!ishuman(H))
|
||||
continue
|
||||
|
||||
if(specific)
|
||||
H = specific
|
||||
if((!H || H.stat == DEAD) && smiting)//safety check, target somehow DIED after we sent a smite
|
||||
message_admins("Smiting Floor Cluwne was deleted due to a lack of valid target. Someone killed them first, or they ceased to exist.")
|
||||
message_admins("Smiting floor cluwne was deleted due to a lack of valid target. Someone killed them first, or they ceased to exist.")
|
||||
qdel(src)
|
||||
return
|
||||
if(H.stat != DEAD && !isLivingSSD(H) && H.client && !H.get_int_organ(/obj/item/organ/internal/honktumor/cursed) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache))
|
||||
current_victim = H
|
||||
return target = current_victim
|
||||
|
||||
if(H && ishuman(H) && H.stat != DEAD && H != current_victim && !isLivingSSD(H) && H.client && !H.get_int_organ(/obj/item/organ/internal/honktumor/cursed) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache))
|
||||
if(H && H.stat != DEAD && H != current_victim && !isLivingSSD(H) && H.client && !H.get_int_organ(/obj/item/organ/internal/honktumor/cursed) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache))
|
||||
current_victim = H
|
||||
interest = 0
|
||||
return target = current_victim
|
||||
|
||||
|
||||
message_admins("Floor Cluwne was deleted due to a lack of valid targets, if this was a manually targeted instance please re-evaluate your choice.")
|
||||
message_admins("Floor cluwne was deleted due to a lack of valid targets[specific ? ", if you spawned this with a specific target please choose another person" : null].")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Manifest()//handles disappearing and appearance anim
|
||||
@@ -195,6 +199,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/On_Stage()
|
||||
var/mob/living/carbon/human/H = current_victim
|
||||
if(!H)
|
||||
Acquire_Victim()
|
||||
switch(stage)
|
||||
|
||||
if(STAGE_HAUNT)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/AttackingTarget()
|
||||
..()
|
||||
if(isliving(target))
|
||||
if(isliving(target) && (!client || a_intent == INTENT_HARM))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("spidertoxin", poison_per_bite)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
|
||||
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
|
||||
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
|
||||
|
||||
|
||||
//These vars are related to how mobs locate and target
|
||||
var/robust_searching = 0 //By default, mobs have a simple searching method, set this to 1 for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
|
||||
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
|
||||
@@ -41,6 +41,8 @@
|
||||
/obj/structure/grille,
|
||||
/obj/structure/girder,
|
||||
/obj/structure/rack,
|
||||
/obj/structure/computerframe,
|
||||
/obj/machinery/constructable_frame,
|
||||
/obj/structure/barricade) //turned into a typecache in New()
|
||||
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
|
||||
var/list/emote_taunt = list()
|
||||
|
||||
@@ -38,7 +38,9 @@
|
||||
var/elimination = 0
|
||||
var/anger_modifier = 0
|
||||
var/obj/item/gps/internal_gps
|
||||
anchored = TRUE
|
||||
move_force = MOVE_FORCE_OVERPOWERING
|
||||
move_resist = MOVE_FORCE_OVERPOWERING
|
||||
pull_force = MOVE_FORCE_OVERPOWERING
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
|
||||
|
||||
@@ -136,7 +136,9 @@
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
anchored = 1 //Stays anchored until death as to be unpullable
|
||||
move_force = MOVE_FORCE_VERY_STRONG
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
pull_force = MOVE_FORCE_VERY_STRONG
|
||||
var/pre_attack = 0
|
||||
loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
|
||||
|
||||
@@ -152,7 +154,9 @@
|
||||
icon_state = "Goliath_preattack"
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/revive()
|
||||
anchored = 1
|
||||
move_force = MOVE_FORCE_VERY_STRONG
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
pull_force = MOVE_FORCE_VERY_STRONG
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
icon_state = "pirateranged"
|
||||
icon_living = "pirateranged"
|
||||
icon_dead = "piratemelee_dead"
|
||||
projectilesound = 'sound/weapons/laser.ogg'
|
||||
projectilesound = 'sound/weapons/Laser.ogg'
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
retreat_distance = 5
|
||||
|
||||
@@ -29,3 +29,23 @@
|
||||
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
unsuitable_atmos_damage = 10
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/goblin
|
||||
name = "clown goblin"
|
||||
desc = "A tiny walking mask and clown shoes. You want to honk his nose!"
|
||||
icon_state = "clowngoblin"
|
||||
icon_living = "clowngoblin"
|
||||
icon_dead = null
|
||||
response_help = "honks the"
|
||||
speak = list("Honk!")
|
||||
speak_emote = list("sqeaks")
|
||||
emote_see = list("honks")
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
speed = -1
|
||||
turns_per_move = 1
|
||||
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/shoes/clown_shoes)
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo
|
||||
name = "Kangaroo"
|
||||
real_name = "Kangaroo"
|
||||
voice_name = "unidentifiable voice"
|
||||
desc = "A large marsupial herbivore. It has powerful hind legs, with nails that resemble long claws."
|
||||
icon_state = "kangaroo" // Credit: FoS
|
||||
icon_living = "kangaroo"
|
||||
icon_dead = "kangaroo_dead"
|
||||
icon_gib = "kangaroo_dead"
|
||||
turns_per_move = 8
|
||||
response_help = "pets"
|
||||
emote_hear = list("bark")
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
harm_intent_damage = 3
|
||||
melee_damage_lower = 5 // avg damage 12.5 without kick, (12.5+12.5+60)/3=25 with kick
|
||||
melee_damage_upper = 20
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg' // they have nails that work like claws, so, slashing sound
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 2, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
move_to_delay = 4 // at 20ticks/sec, this is 5 tile/sec movespeed, about the same as a 'fast human'.
|
||||
speed = -1 // '-1' converts to 1.5 total move delay, or 6.6 tiles/sec movespeed
|
||||
var/attack_cycles = 0
|
||||
var/attack_cycles_max = 3
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo/New()
|
||||
. = ..()
|
||||
// Leap spell, player-only usage
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/leap)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo/AttackingTarget()
|
||||
if(client && a_intent != INTENT_HARM)
|
||||
return ..() // Do not allow player-controlled roos on non-attack intents to 'prime' their kick by nuzzling people.
|
||||
|
||||
var/mob/living/L = target
|
||||
if(!istype(L))
|
||||
return ..() // Do not do further checks if we somehow end up attacking something not alive (like a window).
|
||||
|
||||
if(L.stat == DEAD)
|
||||
return ..() // Do not allow player-controlled roos to prime their kick by attacking corpses.
|
||||
|
||||
attack_cycles++
|
||||
if(attack_cycles < attack_cycles_max)
|
||||
// Most of the time, do a standard attack...
|
||||
return ..()
|
||||
|
||||
// ... but, every attack_cycles_max attacks on a living mob, do a powerful disemboweling kick instead
|
||||
attack_cycles = 0
|
||||
attacktext = "VICIOUSLY KICKS"
|
||||
melee_damage_lower = 60
|
||||
melee_damage_upper = 60
|
||||
. = ..()
|
||||
|
||||
var/rookick_dir = get_dir(src, L)
|
||||
var/turf/general_direction = get_edge_target_turf(L, rookick_dir)
|
||||
L.visible_message("<span class='danger'>[L] is kicked hard!</span>", "<span class='userdanger'>The kangaroo kick sends you flying mate!</span>")
|
||||
L.throw_at(general_direction, 10, 2)
|
||||
|
||||
attacktext = initial(attacktext)
|
||||
melee_damage_lower = initial(melee_damage_lower)
|
||||
melee_damage_upper = initial(melee_damage_upper)
|
||||
|
||||
@@ -42,7 +42,9 @@
|
||||
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
|
||||
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
|
||||
anchored = 1
|
||||
move_force = MOVE_FORCE_EXTREMELY_STRONG
|
||||
move_resist = MOVE_FORCE_EXTREMELY_STRONG
|
||||
pull_force = MOVE_FORCE_EXTREMELY_STRONG
|
||||
status_flags = GODMODE // Cannot push also
|
||||
|
||||
var/cannot_be_seen = 1
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/alert_on_death = FALSE
|
||||
var/alert_on_timeout = FALSE
|
||||
var/alert_on_timeout = TRUE
|
||||
var/alert_on_spacing = TRUE
|
||||
var/alert_on_shield_breach = FALSE
|
||||
var/seen_enemy = FALSE
|
||||
@@ -99,6 +99,7 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/New()
|
||||
..()
|
||||
name = "[name] [pick(GLOB.last_names)]"
|
||||
// Do not attempt to move this code to Initialize() or LateInitialize(). Doing so with other objects has caused bugs in the past, because assigning "depotarea" may not work there.
|
||||
depotarea = areaMaster
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
@@ -197,7 +198,6 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer
|
||||
name = "Syndicate Officer"
|
||||
alert_on_death = TRUE
|
||||
alert_on_timeout = TRUE
|
||||
melee_block_chance = 60
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory
|
||||
@@ -209,7 +209,6 @@
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
melee_block_chance = 80
|
||||
alert_on_timeout = TRUE
|
||||
alert_on_shield_breach = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize()
|
||||
|
||||
@@ -561,17 +561,16 @@
|
||||
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/update_sight(reset_sight = FALSE)
|
||||
/mob/living/simple_animal/update_sight()
|
||||
if(!client)
|
||||
return
|
||||
if(stat == DEAD)
|
||||
grant_death_vision()
|
||||
return
|
||||
|
||||
if(reset_sight)
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
sight = initial(sight)
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
sight = initial(sight)
|
||||
|
||||
if(client.eye != src)
|
||||
var/atom/A = client.eye
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/mob_type = /mob/living/simple_animal/hostile/carp
|
||||
var/spawn_text = "emerges from"
|
||||
status_flags = 0
|
||||
anchored = 1
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
AIStatus = AI_OFF
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
var/obj/machinery/machine = null
|
||||
var/other_mobs = null
|
||||
var/memory = ""
|
||||
var/atom/movable/pulling = null
|
||||
var/next_move = null
|
||||
var/notransform = null //Carbon
|
||||
var/other = 0.0
|
||||
@@ -48,7 +47,6 @@
|
||||
var/bhunger = 0 //Carbon
|
||||
var/lying = 0
|
||||
var/lying_prev = 0
|
||||
var/canmove = 1
|
||||
var/lastpuke = 0
|
||||
var/unacidable = 0
|
||||
var/can_strip = 1
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
stat = 2
|
||||
canmove = 0
|
||||
|
||||
anchored = 1 // don't get pushed around
|
||||
|
||||
/mob/new_player/New()
|
||||
GLOB.mob_list += src
|
||||
|
||||
@@ -295,6 +293,13 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
/mob/new_player/proc/IsSyndicateCommand(rank)
|
||||
var/datum/job/job = job_master.GetJob(rank)
|
||||
if(job.syndicate_command)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at)
|
||||
if(src != usr)
|
||||
return 0
|
||||
@@ -336,6 +341,8 @@
|
||||
if(IsAdminJob(rank))
|
||||
if(IsERTSpawnJob(rank))
|
||||
character.loc = pick(ertdirector)
|
||||
else if(IsSyndicateCommand(rank))
|
||||
character.loc = pick(syndicateofficer)
|
||||
else
|
||||
character.loc = pick(aroomwarp)
|
||||
join_message = "has arrived"
|
||||
|
||||
@@ -122,13 +122,13 @@
|
||||
/datum/sprite_accessory/hair/ipc/fluff
|
||||
fluff = 1
|
||||
|
||||
/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair
|
||||
name = "Lumi Face"
|
||||
icon_state = "lumi_face"
|
||||
/datum/sprite_accessory/hair/ipc/fluff/lumi_eyes //Lumi Fluff hair
|
||||
name = "Lumi Eyes"
|
||||
icon_state = "lumi_eyes"
|
||||
|
||||
/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair
|
||||
name = "Lumi Blush"
|
||||
icon_state = "lumi_blush"
|
||||
/datum/sprite_accessory/hair/ipc/fluff/lumi_music //Lumi Fluff hair
|
||||
name = "Lumi Music"
|
||||
icon_state = "lumi_music"
|
||||
|
||||
/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair
|
||||
name = "Lumi Waiting"
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
//this and stop_pulling really ought to be /mob/living procs
|
||||
/mob/proc/start_pulling(atom/movable/AM)
|
||||
if(src == AM) // Trying to pull yourself is a shortcut to stop pulling
|
||||
stop_pulling()
|
||||
return
|
||||
if(!AM || !isturf(AM.loc)) //if there's no object or the object being pulled is inside something: abort!
|
||||
return
|
||||
if(incapacitated())
|
||||
return
|
||||
if(!(AM.anchored))
|
||||
AM.add_fingerprint(src)
|
||||
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
if(pulling)
|
||||
// Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
|
||||
if(AM == pulling)
|
||||
return
|
||||
stop_pulling()
|
||||
if(AM.pulledby)
|
||||
visible_message("<span class='danger'>[src] has pulled [AM] from [AM.pulledby]'s grip.</span>")
|
||||
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
|
||||
|
||||
pulling = AM
|
||||
AM.pulledby = src
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
/mob/verb/stop_pulling()
|
||||
set name = "Stop Pulling"
|
||||
set category = "IC"
|
||||
|
||||
if(pulling)
|
||||
pulling.pulledby = null
|
||||
pulling = null
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
|
||||
/mob/living/proc/check_pull()
|
||||
if(pulling && !(pulling in orange(1)))
|
||||
stop_pulling()
|
||||
@@ -34,7 +34,8 @@
|
||||
/datum/job/chaplain,
|
||||
/datum/job/ntnavyofficer,
|
||||
/datum/job/ntspecops,
|
||||
/datum/job/civilian
|
||||
/datum/job/civilian,
|
||||
/datum/job/syndicateofficer
|
||||
)
|
||||
|
||||
//The scaling factor of max total positions in relation to the total amount of people on board the station in %
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(usr != owner && !check_rights(R_ADMIN))
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] - failed permissions check in nano_module/law_manager/Topic")
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] - failed permissions check in nano_module/law_manager/Topic")
|
||||
return 1
|
||||
|
||||
if(href_list["set_view"])
|
||||
current_view = text2num(href_list["set_view"])
|
||||
return 1
|
||||
|
||||
@@ -83,7 +83,7 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing)
|
||||
if(containedpen)
|
||||
overlays += "clipboard_pen"
|
||||
overlays += "clipboard_over"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clipboard/attackby(obj/item/W, mob/user)
|
||||
if(isPaperwork(W)) //If it's a photo, paper bundle, or piece of paper, place it on the clipboard.
|
||||
@@ -114,6 +114,8 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing)
|
||||
else if(istype(W, /obj/item/stamp) && toppaper) //We can stamp the topmost piece of paper
|
||||
toppaper.attackby(W, user)
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/clipboard/attack_self(mob/user)
|
||||
showClipboard(user)
|
||||
|
||||
@@ -61,6 +61,7 @@ var/global/list/fax_blacklist = list()
|
||||
/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
req_one_access = list()
|
||||
to_chat(user, "<span class='notice'>The transmitters realign to an unknown source!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You swipe the card through [src], but nothing happens.</span>")
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
overlays.Cut()
|
||||
if(contents.len)
|
||||
overlays += "folder_paper"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/folder/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/paper_bundle) || istype(W, /obj/item/documents))
|
||||
@@ -43,7 +43,8 @@
|
||||
|
||||
if((loc == usr || Adjacent(usr)) && usr.stat == 0)
|
||||
name = "folder[(n_name ? text("- '[n_name]'") : null)]"
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/folder/attack_self(mob/user as mob)
|
||||
var/dat = "<title>[name]</title>"
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
updateinfolinks()
|
||||
|
||||
/obj/item/paper/update_icon()
|
||||
..()
|
||||
if(icon_state == "paper_talisman")
|
||||
return
|
||||
if(info)
|
||||
@@ -303,12 +304,6 @@
|
||||
if(user.mind && (user.mind.assigned_role == "Clown"))
|
||||
clown = 1
|
||||
|
||||
if(istype(P, /obj/item/stack/tape_roll))
|
||||
var/obj/item/stack/tape_roll/tape = P
|
||||
tape.stick(src, user)
|
||||
tape.use(1)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/paper) || istype(P, /obj/item/photo))
|
||||
if(istype(P, /obj/item/paper/carbon))
|
||||
var/obj/item/paper/carbon/C = P
|
||||
|
||||
@@ -62,8 +62,6 @@
|
||||
to_chat(user, "<span class='notice'>You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].</span>")
|
||||
qdel(W)
|
||||
else
|
||||
if(istype(W, /obj/item/stack/tape_roll))
|
||||
return 0
|
||||
if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon))
|
||||
usr << browse("", "window=[name]") //Closes the dialog
|
||||
P = src[page]
|
||||
@@ -217,6 +215,7 @@
|
||||
|
||||
|
||||
/obj/item/paper_bundle/update_icon()
|
||||
..()
|
||||
if(contents.len)
|
||||
var/obj/item/paper/P = src[1]
|
||||
icon_state = P.icon_state
|
||||
|
||||
@@ -87,14 +87,14 @@
|
||||
|
||||
|
||||
/obj/item/paper_bin/attackby(obj/item/paper/i as obj, mob/user as mob, params)
|
||||
if(!istype(i))
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
i.loc = src
|
||||
to_chat(user, "<span class='notice'>You put [i] in [src].</span>")
|
||||
papers.Add(i)
|
||||
amount++
|
||||
if(istype(i))
|
||||
user.drop_item()
|
||||
i.loc = src
|
||||
to_chat(user, "<span class='notice'>You put [i] in [src].</span>")
|
||||
papers.Add(i)
|
||||
amount++
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/paper_bin/examine(mob/user)
|
||||
@@ -110,7 +110,7 @@
|
||||
icon_state = "paper_bin0"
|
||||
else
|
||||
icon_state = "paper_bin1"
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/paper_bin/carbon
|
||||
name = "carbonless paper bin"
|
||||
|
||||
@@ -62,6 +62,16 @@
|
||||
if(toner <= 0)
|
||||
break
|
||||
|
||||
if(copier_items_printed >= copier_max_items) //global vars defined in misc.dm
|
||||
if(prob(10))
|
||||
visible_message("<span class='warning'>The printer screen reads \"PC LOAD LETTER\".</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>The printer screen reads \"PHOTOCOPIER NETWORK OFFLINE, PLEASE CONTACT SYSTEM ADMINISTRATOR\".</span>")
|
||||
if(!copier_items_printed_logged)
|
||||
message_admins("Photocopier cap of [copier_max_items] papers reached, all photocopiers are now disabled. This may be the cause of any lag.")
|
||||
copier_items_printed_logged = TRUE
|
||||
break
|
||||
|
||||
if(emag_cooldown > world.time)
|
||||
return
|
||||
|
||||
@@ -86,7 +96,7 @@
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>\The [copyitem] can't be copied by \the [src].</span>")
|
||||
break
|
||||
|
||||
copier_items_printed++
|
||||
use_power(active_power_usage)
|
||||
updateUsrDialog()
|
||||
else if(href_list["remove"])
|
||||
|
||||
@@ -589,6 +589,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
|
||||
else
|
||||
icon_state = "coil"
|
||||
name = "cable coil"
|
||||
..()
|
||||
|
||||
/obj/item/stack/cable_coil/proc/update_wclass()
|
||||
if(amount == 1)
|
||||
|
||||
@@ -140,24 +140,19 @@
|
||||
|
||||
////////Laser Tag////////////////////
|
||||
|
||||
/obj/item/gun/energy/laser/bluetag
|
||||
/obj/item/gun/energy/laser/tag
|
||||
name = "laser tag gun"
|
||||
icon_state = "bluetag"
|
||||
desc = "Standard issue weapon of the Imperial Guard"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
|
||||
origin_tech = "combat=2;magnets=2"
|
||||
clumsy_check = 0
|
||||
needs_permit = 0
|
||||
ammo_x_offset = 2
|
||||
selfcharge = 1
|
||||
|
||||
/obj/item/gun/energy/laser/redtag
|
||||
name = "laser tag gun"
|
||||
/obj/item/gun/energy/laser/tag/blue
|
||||
icon_state = "bluetag"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
|
||||
|
||||
/obj/item/gun/energy/laser/tag/red
|
||||
icon_state = "redtag"
|
||||
desc = "Standard issue weapon of the Imperial Guard"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
|
||||
origin_tech = "combat=2;magnets=2"
|
||||
clumsy_check = 0
|
||||
needs_permit = 0
|
||||
ammo_x_offset = 2
|
||||
selfcharge = 1
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
ammo_x_offset = 2
|
||||
charge_sections = 3
|
||||
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
|
||||
actions_types = list(/datum/action/item_action/toggle_gunlight)
|
||||
|
||||
/obj/item/gun/energy/gun/mini/New()
|
||||
gun_light = new /obj/item/flashlight/seclite(src)
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
modifystate = -1
|
||||
origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/plasma)
|
||||
fire_sound = 'sound/weapons/laser.ogg'
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
usesound = 'sound/items/Welder.ogg'
|
||||
toolspeed = 1
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
item_state = "honker"
|
||||
max_charges = 4
|
||||
recharge_rate = 8
|
||||
fire_sound = 'sound/items/airhorn.ogg'
|
||||
fire_sound = 'sound/items/Airhorn.ogg'
|
||||
|
||||
/obj/item/gun/magic/staff/focus
|
||||
name = "mental focus"
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
/obj/item/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(alarmed) // Did the empty clip alarm go off already?
|
||||
alarmed = 0 // Reset the alarm once a magazine is loaded
|
||||
return
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
@@ -33,6 +35,8 @@
|
||||
magazine = null
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You insert the magazine into \the [src].</span>")
|
||||
if(alarmed)
|
||||
alarmed = 0
|
||||
user.remove_from_mob(AM)
|
||||
magazine = AM
|
||||
magazine.loc = src
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
stat |= NOPOWER
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_master/attackby(obj/item/B, mob/user, params)
|
||||
if(default_unfasten_wrench(user, B))
|
||||
|
||||
@@ -444,8 +444,6 @@
|
||||
taste_message = "eggs"
|
||||
|
||||
/datum/reagent/consumable/egg/on_mob_life(mob/living/M)
|
||||
if(prob(8))
|
||||
M.emote("fart")
|
||||
if(prob(3))
|
||||
M.reagents.add_reagent("cholesterol", rand(1,2))
|
||||
..()
|
||||
@@ -644,8 +642,6 @@
|
||||
taste_message = "burritos"
|
||||
|
||||
/datum/reagent/consumable/beans/on_mob_life(mob/living/M)
|
||||
if(prob(10))
|
||||
M.emote("fart")
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/bread
|
||||
|
||||
@@ -844,13 +844,6 @@
|
||||
|
||||
/datum/reagent/medicine/insulin/on_mob_life(mob/living/M)
|
||||
M.reagents.remove_reagent("sugar", 5)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/simethicone
|
||||
name = "Simethicone"
|
||||
id = "simethicone"
|
||||
description = "This strange liquid seems to have no bubbles on the surface."
|
||||
color = "#14AA46"
|
||||
|
||||
/datum/reagent/medicine/teporone
|
||||
name = "Teporone"
|
||||
|
||||
@@ -366,31 +366,6 @@
|
||||
to_chat(H, "<span class='notice'>Hair bursts forth from your every follicle!")
|
||||
..()
|
||||
|
||||
/datum/reagent/fartonium
|
||||
name = "Fartonium"
|
||||
id = "fartonium"
|
||||
description = "Oh god it never ends, IT NEVER STOPS!"
|
||||
reagent_state = GAS
|
||||
color = "#D06E27"
|
||||
taste_message = "mexican cuisine"
|
||||
|
||||
/datum/reagent/fartonium/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
if(prob(66))
|
||||
M.emote("fart")
|
||||
|
||||
if(holder.has_reagent("simethicone"))
|
||||
if(prob(25))
|
||||
to_chat(M, "<span class='danger'>[pick("Oh god, something doesn't feel right!", "IT HURTS!", "FUCK!", "Something is seriously wrong!", "THE PAIN!", "You feel like you're gonna die!")]</span>")
|
||||
update_flags |= M.adjustBruteLoss(1, FALSE)
|
||||
if(prob(10))
|
||||
M.custom_emote(1,"strains, but nothing happens.")
|
||||
update_flags |= M.adjustBruteLoss(2, FALSE)
|
||||
if(prob(5))
|
||||
M.emote("scream")
|
||||
update_flags |= M.adjustBruteLoss(4, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/hugs
|
||||
name = "Pure hugs"
|
||||
id = "hugs"
|
||||
|
||||
@@ -225,13 +225,6 @@
|
||||
mix_message = "A minty and refreshing smell drifts from the effervescent mixture."
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
/datum/chemical_reaction/simethicone
|
||||
name = "simethicone"
|
||||
id = "simethicone"
|
||||
result = "simethicone"
|
||||
required_reagents = list("hydrogen" = 1, "chlorine" = 1, "silicon" = 1, "oxygen" = 1)
|
||||
result_amount = 4
|
||||
|
||||
/datum/chemical_reaction/teporone
|
||||
name = "Teporone"
|
||||
id = "teporone"
|
||||
|
||||
@@ -239,14 +239,6 @@
|
||||
result_amount = 3
|
||||
mix_message = "The liquid becomes amazingly furry and smells peculiar."
|
||||
|
||||
/datum/chemical_reaction/fartonium
|
||||
name = "Fartonium"
|
||||
id = "fartonium"
|
||||
result = "fartonium"
|
||||
required_reagents = list("fake_cheese" = 1, "beans" = 1, "????" = 1, "egg" = 1)
|
||||
result_amount = 2
|
||||
mix_message = "The substance makes a little 'toot' noise and starts to smell pretty bad."
|
||||
|
||||
/datum/chemical_reaction/soapification
|
||||
name = "Soapification"
|
||||
id = "soapification"
|
||||
|
||||
@@ -148,8 +148,8 @@
|
||||
to_chat(user, "<span class='notice'>You set the label to \"[tmp_label]\".</span>")
|
||||
label_text = tmp_label
|
||||
update_name_label()
|
||||
if(istype(I,/obj/item/storage/bag))
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/glass/proc/update_name_label()
|
||||
if(label_text == "")
|
||||
@@ -201,6 +201,7 @@
|
||||
overlays += lid
|
||||
if(assembly)
|
||||
overlays += "assembly"
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/verb/remove_assembly()
|
||||
set name = "Remove Assembly"
|
||||
|
||||
@@ -16,6 +16,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
desc = "It's a conveyor belt, commonly used to transport large numbers of items elsewhere quite quickly."
|
||||
layer = CONVEYOR_LAYER // so they appear under stuff but not below stuff like vents
|
||||
anchored = TRUE
|
||||
move_force = MOVE_FORCE_DEFAULT
|
||||
var/operating = FALSE //NB: this can be TRUE while the belt doesn't go
|
||||
var/forwards // The direction the conveyor sends you in
|
||||
var/backwards // hopefully self-explanatory
|
||||
@@ -183,9 +184,12 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
..()
|
||||
|
||||
/obj/machinery/conveyor/proc/move_thing(atom/movable/AM)
|
||||
if(move_force < (AM.move_resist))
|
||||
return FALSE
|
||||
if(!AM.anchored && AM.loc == loc)
|
||||
step(AM, forwards)
|
||||
|
||||
|
||||
/obj/machinery/conveyor/proc/can_conveyor_run()
|
||||
if(stat & BROKEN)
|
||||
return FALSE
|
||||
|
||||
@@ -80,3 +80,13 @@
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 100)
|
||||
build_path = /obj/item/radio/beacon
|
||||
category = list("Bluespace")
|
||||
|
||||
/datum/design/brpd
|
||||
name = "Bluespace Rapid Pipe Dispenser (BRPD)"
|
||||
desc = "Similar to the Rapid Pipe Dispenser, lets you rapidly dispense pipes. Now at long range!"
|
||||
req_tech = list("bluespace" = 3, "toxins" = 6)
|
||||
id = "brpd"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500, MAT_SILVER = 3000)
|
||||
build_path = /obj/item/rpd/bluespace
|
||||
category = list("Bluespace")
|
||||
|
||||
@@ -101,11 +101,21 @@
|
||||
build_path = /obj/item/bikehorn/airhorn
|
||||
category = list("Equipment")
|
||||
|
||||
/datum/design/breath_mask
|
||||
name = "Breath mask"
|
||||
desc = "A close-fitting mask that can be connected to an air supply."
|
||||
id = "breathmask"
|
||||
req_tech = list("toxins" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 300, MAT_GLASS = 200)
|
||||
build_path = /obj/item/clothing/mask/breath
|
||||
category = list("Equipment")
|
||||
|
||||
/datum/design/welding_mask
|
||||
name = "Welding Gas Mask"
|
||||
desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
|
||||
id = "weldingmask"
|
||||
req_tech = list("materials" = 2, "engineering" = 3)
|
||||
req_tech = list("materials" = 2, "engineering" = 3, "toxins" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/clothing/mask/gas/welding
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=50)
|
||||
build_path = /obj/item/clothing/mask/muzzle/safety/shock
|
||||
category = list("Miscellaneous")
|
||||
|
||||
|
||||
/datum/design/data_disk
|
||||
name = "Genetics Data Disk"
|
||||
desc = "Disk that allows you to store genetic data."
|
||||
@@ -90,3 +90,43 @@
|
||||
materials = list(MAT_METAL=300, MAT_GLASS=100)
|
||||
build_path = /obj/item/disk/data
|
||||
category = list("Miscellaneous")
|
||||
|
||||
/datum/design/emergency_oxygen
|
||||
name = "Empty Emergency Oxygen Tank"
|
||||
desc = "Used for emergencies. Onl contains very little oxygen once filled up."
|
||||
id = "emergencyoxygen"
|
||||
req_tech = list("toxins" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=100)
|
||||
build_path = /obj/item/tank/emergency_oxygen/empty
|
||||
category = list("Miscellaneous")
|
||||
|
||||
/datum/design/extended_oxygen
|
||||
name = "Empty Extended Emergency Oxygen Tank"
|
||||
desc = "Used for emergencies. Can contain a decent amount of oxygen once filled up."
|
||||
id = "extendedoxygen"
|
||||
req_tech = list("toxins" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=800, MAT_GLASS=100)
|
||||
build_path = /obj/item/tank/emergency_oxygen/engi/empty
|
||||
category = list("Miscellaneous")
|
||||
|
||||
/datum/design/double_oxygen
|
||||
name = "Empty Double Emergency Oxygen Tank"
|
||||
desc = "Used for emergencies. Can contain a good amount of oxygen once filled up."
|
||||
id = "doubleoxygen"
|
||||
req_tech = list("toxins" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=1500, MAT_GLASS=200)
|
||||
build_path = /obj/item/tank/emergency_oxygen/double/empty
|
||||
category = list("Miscellaneous")
|
||||
|
||||
/datum/design/oxygen_tank
|
||||
name = "Empty Oxygen Tank"
|
||||
desc = "A large, empty air tank."
|
||||
id = "oxygentank"
|
||||
req_tech = list("toxins" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=3000, MAT_GLASS=500)
|
||||
build_path = /obj/item/tank/oxygen/empty
|
||||
category = list("Miscellaneous")
|
||||
|
||||
@@ -271,6 +271,13 @@ research holder datum.
|
||||
id = "programming"
|
||||
max_level = 7
|
||||
|
||||
/datum/tech/toxins //not meant to be raised by deconstruction, do not give objects toxins as an origin_tech
|
||||
name = "Toxins Research"
|
||||
desc = "Research into plasma based explosive devices. Upgrade through testing explosives in the toxins lab."
|
||||
id = "toxins"
|
||||
max_level = 7
|
||||
rare = 2
|
||||
|
||||
/datum/tech/syndicate
|
||||
name = "Illegal Technologies Research"
|
||||
desc = "The study of technologies that violate standard Nanotrasen regulations."
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
/obj/item/clothing/head/helmet/ert/command = 1,
|
||||
/obj/item/clothing/mask/gas/sechailer = 1,
|
||||
/obj/item/restraints/handcuffs = 1,
|
||||
/obj/item/storage/lockbox/mindshield = 1
|
||||
/obj/item/storage/lockbox/mindshield = 1,
|
||||
/obj/item/flashlight = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/centcom/response_team/commander/red
|
||||
@@ -216,7 +217,8 @@
|
||||
/obj/item/clothing/mask/gas = 1,
|
||||
/obj/item/t_scanner = 1,
|
||||
/obj/item/stack/sheet/glass/fifty = 1,
|
||||
/obj/item/stack/sheet/metal/fifty = 1
|
||||
/obj/item/stack/sheet/metal/fifty = 1,
|
||||
/obj/item/flashlight = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/centcom/response_team/engineer/red
|
||||
@@ -224,7 +226,7 @@
|
||||
shoes = /obj/item/clothing/shoes/magboots/advance
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
belt = /obj/item/storage/belt/utility/chief/full
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer/gamma
|
||||
suit_store = /obj/item/tank/emergency_oxygen/engi
|
||||
glasses = /obj/item/clothing/glasses/meson
|
||||
cybernetic_implants = list(
|
||||
@@ -235,7 +237,7 @@
|
||||
r_pocket = /obj/item/melee/classic_baton/telescopic
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer/gamma = 1,
|
||||
/obj/item/clothing/mask/gas = 1,
|
||||
/obj/item/rcd/preloaded = 1,
|
||||
/obj/item/rcd_ammo = 3,
|
||||
@@ -302,7 +304,9 @@
|
||||
/obj/item/storage/firstaid/regular = 1,
|
||||
/obj/item/storage/box/autoinjectors = 1,
|
||||
/obj/item/roller = 1,
|
||||
/obj/item/storage/pill_bottle/ert = 1
|
||||
/obj/item/storage/pill_bottle/ert = 1,
|
||||
/obj/item/flashlight = 1,
|
||||
/obj/item/healthupgrade = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/centcom/response_team/medic/red
|
||||
@@ -330,7 +334,8 @@
|
||||
/obj/item/storage/box/autoinjectors = 1,
|
||||
/obj/item/roller = 1,
|
||||
/obj/item/clothing/shoes/magboots = 1,
|
||||
/obj/item/bodyanalyzer = 1
|
||||
/obj/item/bodyanalyzer = 1,
|
||||
/obj/item/healthupgrade = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/centcom/response_team/medic/gamma
|
||||
@@ -351,8 +356,9 @@
|
||||
/obj/item/clothing/mask/gas/sechailer/swat = 1,
|
||||
/obj/item/bodyanalyzer/advanced = 1,
|
||||
/obj/item/extinguisher/mini = 1,
|
||||
/obj/item/storage/belt/medical/surgery/loaded = 1,
|
||||
/obj/item/roller = 1
|
||||
/obj/item/roller = 1,
|
||||
/obj/item/healthanalyzer/advanced = 1
|
||||
|
||||
)
|
||||
|
||||
cybernetic_implants = list(
|
||||
@@ -379,7 +385,8 @@
|
||||
pda = /obj/item/pda/centcom
|
||||
backpack_contents = list(
|
||||
/obj/item/clothing/mask/gas/sechailer/swat = 1,
|
||||
/obj/item/storage/box/zipties = 1
|
||||
/obj/item/storage/box/zipties = 1,
|
||||
/obj/item/flashlight/seclite = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/centcom/response_team/paranormal/amber
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user