fix merge conflict, wipe map changes

This commit is contained in:
Kyep
2019-01-03 14:39:41 -08:00
286 changed files with 4882 additions and 2538 deletions
@@ -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!
+18 -14
View File
@@ -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)
+4 -3
View File
@@ -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
+4
View File
@@ -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."
+4 -1
View File
@@ -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
+35
View File
@@ -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)
..()
+10 -9
View File
@@ -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
+24 -3
View File
@@ -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>")
+2 -4
View File
@@ -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',
+4 -3
View File
@@ -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"
+2 -2
View File
@@ -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(
+4 -2
View File
@@ -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
+18
View File
@@ -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
+64 -4
View File
@@ -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 ////////////
//////////////////////////////////
+1
View File
@@ -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 -1
View File
@@ -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,
+3 -2
View File
@@ -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)
+41
View File
@@ -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."
+3 -1
View File
@@ -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
+4
View File
@@ -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()
+2 -1
View File
@@ -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)
+2 -1
View File
@@ -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
View File
@@ -3,3 +3,6 @@
/mob/dead/gib() //ghosts can't be gibbed.
return
/mob/dead
move_resist = INFINITY
+2 -2
View File
@@ -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)
+10
View File
@@ -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
+1 -1
View File
@@ -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)
+76 -25
View File
@@ -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
+2 -2
View File
@@ -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))
+23 -4
View File
@@ -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
+2 -6
View File
@@ -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)
. = ..()
+36 -19
View File
@@ -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]&nbsp;</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]&nbsp;</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]&nbsp;</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]&nbsp;</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
-2
View File
@@ -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
+9 -2
View File
@@ -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"
-46
View File
@@ -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 %
+5
View File
@@ -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
+3 -1
View File
@@ -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)
+1
View File
@@ -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>")
+3 -2
View File
@@ -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>"
+1 -6
View File
@@ -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
+1 -2
View File
@@ -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
+9 -9
View File
@@ -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"
+11 -1
View File
@@ -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"])
+1
View File
@@ -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)
+6 -11
View File
@@ -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
+1 -1
View File
@@ -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"
+4
View File
@@ -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
+41 -1
View File
@@ -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")
+7
View File
@@ -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."
+16 -9
View File
@@ -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