Merge branch 'bleeding-edge-freeze' of https://github.com/Baystation12/Baystation12 into xenoarch

Conflicts:
	baystation12.dme
	code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
	icons/obj/device.dmi

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2013-02-25 14:30:00 +10:00
141 changed files with 10412 additions and 8264 deletions
+1 -1
View File
@@ -641,7 +641,7 @@ var/list/admin_verbs_mod = list(
if(!istype(M, /mob/living/carbon/human))
usr << "\red You can only do this to humans!"
return
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Soghun and Tajaran can result in unintended consequences.",,"Yes","No"))
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi and Tajaran can result in unintended consequences.",,"Yes","No"))
if("No")
return
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
+8 -6
View File
@@ -74,7 +74,7 @@
var/recieve_color = "purple"
var/send_pm_type = ""
var/recieve_pm_type = "Player"
//usr.client.holder.rights
if(holder)
//mod PMs are maroon
@@ -91,17 +91,17 @@
src << "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>"
return
var/recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
var/recieve_message = ""
if(holder && !C.holder)
recieve_message = "<font color='[recieve_color]' size='4'><b>-- Administrator private message --</b></font>\n" + recieve_message
recieve_message = "<font color='[recieve_color]' size='4'><b>-- Administrator private message --</b></font>\n"
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
if(config.popup_admin_pm)
spawn(0) //so we don't hold the caller proc up
var/sender = src
var/sendername = key
var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
var/reply = input(C, msg,"[recieve_pm_type] PM from-[sendername]", "") as text|null //show message and await a reply
if(C && reply)
if(sender)
C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
@@ -109,8 +109,9 @@
adminhelp(reply) //sender has left, adminhelp instead
return
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[key_name(src, C, C.holder ? 1 : 0)]</b>: [msg]</font>"
C << recieve_message
src << "<font color='blue'>[send_pm_type] PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
src << "<font color='blue'>[send_pm_type] PM to-<b>[key_name(C, src, holder ? 1 : 0)]</b>: [msg]</font>"
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
@@ -177,6 +178,7 @@
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in admins)
//check client/X is an admin and isn't the sender or recipient
//only admins can see PMs
if(X == C || X == src)
continue
if(X.key!=key && X.key!=C.key && (X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD) )
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;[key_name(C, X, 0)]:</B> \blue [msg]</font>" //inform X
+18
View File
@@ -790,6 +790,24 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
if("emergency rescue team")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Emergency Rescue Team"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
if("special ops officer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/swat/officer(M), slot_wear_suit)
+4 -4
View File
@@ -768,8 +768,8 @@ datum/preferences
var/prev_species = species
var/whitelisted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
if(is_alien_whitelisted(user, "Soghun")) //Check for Soghun and admins
new_species += "Soghun"
if(is_alien_whitelisted(user, "Soghun")) //Check for Unathi and admins
new_species += "Unathi"
whitelisted = 1
if(is_alien_whitelisted(user, "Tajaran")) //Check for Tajaran and admins
new_species += "Tajaran"
@@ -782,7 +782,7 @@ datum/preferences
alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
else //Not using the whitelist? Aliens for everyone!
new_species += "Tajaran"
new_species += "Soghun"
new_species += "Unathi"
new_species += "Skrell"
species = input("Please select a species", "Character Generation", null) in new_species
@@ -843,7 +843,7 @@ datum/preferences
b_type = new_b_type
if("hair")
if(species == "Human" || species == "Soghun")
if(species == "Human" || species == "Unathi")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null
if(new_hair)
r_hair = hex2num(copytext(new_hair, 2, 4))
+14 -10
View File
@@ -1,19 +1,23 @@
/obj/item/clothing/head/helmet/space/helmet_soghun_cheap
/obj/item/clothing/head/helmet/space/unathi
var/up = 0 //So Unathi helmets play nicely with the weldervision check.
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
name = "NT breacher helmet"
desc = "Hey! Watch it with that thing! It's a knock-off of a soghun battle-helm, and that spike could put someone's eye out."
icon_state = "sog_helm_cheap"
item_state = "sog_helm_cheap"
color = "sog_helm_cheap"
desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
icon_state = "unathi_helm_cheap"
item_state = "unathi_helm_cheap"
color = "unathi_helm_cheap"
armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
heat_protection = HEAD
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE
/obj/item/clothing/suit/space/rig_soghun_cheap
/obj/item/clothing/suit/space/unathi/rig_cheap
name = "NT breacher chassis"
desc = "A cheap NT knock-off of a soghun battle-rig. Looks like a fish, moves like a fish, steers like a cow."
icon_state = "rig-soghun-cheap"
item_state = "rig-soghun-cheap"
slowdown = 2
desc = "A cheap NT knock-off of a Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
icon_state = "rig-unathi-cheap"
item_state = "rig-unathi-cheap"
slowdown = 3
armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+15
View File
@@ -0,0 +1,15 @@
//Unathi clothing.
/obj/item/clothing/suit/unathi/robe
name = "roughspun robes"
desc = "A traditional Unathi garment."
icon_state = "robe-unathi"
item_state = "robe-unathi"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/suit/unathi/mantle
name = "hide mantle"
desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
icon_state = "mantle-unathi"
item_state = "mantle-unathi"
body_parts_covered = UPPER_TORSO
+23 -13
View File
@@ -4,6 +4,7 @@
oneShot = 1
var/list/obj/machinery/vending/vendingMachines = list()
var/list/obj/machinery/vending/infectedVendingMachines = list()
var/obj/machinery/vending/originMachine
@@ -28,20 +29,29 @@
/datum/event/brand_intelligence/tick()
if(!vendingMachines.len || !originMachine || originMachine.shut_up) //if every machine is infected, or if the original vending machine is missing or has it's voice switch flipped
end()
kill()
return
if(IsMultiple(activeFor, 3))
var/obj/machinery/vending/infectedMachine = pick(vendingMachines)
vendingMachines.Remove(infectedMachine)
infectedMachine.shut_up = 0
infectedMachine.shoot_inventory = 1
if(IsMultiple(activeFor, 5))
if(prob(25))
var/obj/machinery/vending/infectedMachine = pick(vendingMachines)
vendingMachines.Remove(infectedMachine)
infectedVendingMachines.Add(infectedMachine)
infectedMachine.shut_up = 0
infectedMachine.shoot_inventory = 1
if(IsMultiple(activeFor, 12))
originMachine.speak(pick("Try our aggressive new marketing strategies!", \
"You should buy products to feed your lifestyle obession!", \
"Consume!", \
"Your money can buy happiness!", \
"Engage direct marketing!", \
"Advertising is legalized lying! But don't let that put you off our great deals!", \
"You don't want to buy anything? Yeah, well I didn't want to buy your mom either."))
if(IsMultiple(activeFor, 12))
originMachine.speak(pick("Try our aggressive new marketing strategies!", \
"You should buy products to feed your lifestyle obession!", \
"Consume!", \
"Your money can buy happiness!", \
"Engage direct marketing!", \
"Advertising is legalized lying! But don't let that put you off our great deals!", \
"You don't want to buy anything? Yeah, well I didn't want to buy your mom either."))
/datum/event/brand_intelligence/end()
for(var/obj/machinery/vending/infectedMachine in infectedVendingMachines)
if(prob(90))
infectedMachine.shut_up = 1
infectedMachine.shoot_inventory = 0
+11 -2
View File
@@ -1,15 +1,24 @@
/datum/event/carp_migration
announceWhen = 50
oneShot = 1
endWhen = 900
var/list/spawned_carp = list()
/datum/event/carp_migration/setup()
announceWhen = rand(40, 60)
endWhen = rand(600,1200)
/datum/event/carp_migration/announce()
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
/datum/event/carp_migration/start()
for(var/obj/effect/landmark/C in landmarks_list)
if(C.name == "carpspawn")
new /mob/living/simple_animal/hostile/carp(C.loc)
spawned_carp.Add(new /mob/living/simple_animal/hostile/carp(C.loc))
/datum/event/carp_migration/end()
for(var/mob/living/simple_animal/hostile/carp/C in spawned_carp)
if(!C.stat)
var/turf/T = get_turf(C)
if(istype(T, /turf/space))
del(C)
+2 -2
View File
@@ -43,7 +43,7 @@
possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"]
possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"]
possibleEvents[/datum/event/rogue_drone] = 50 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"]
possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"]
possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"]
possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25
@@ -167,7 +167,7 @@
active_with_role["Janitor"] = 0
for(var/mob/M in player_list)
if(!M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
continue
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
+2 -3
View File
@@ -4,7 +4,6 @@ var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event
var/eventTimeLower = 15000 //15 minutes
var/eventTimeUpper = 30000 //30 minutes
var/scheduledEvent = null
@@ -19,7 +18,7 @@ var/scheduledEvent = null
/proc/checkEvent()
if(!scheduledEvent)
//more players = more time between events, less players = less time between events
var/playercount_modifier = 0.5
var/playercount_modifier = 1
switch(player_list.len)
if(0 to 10)
playercount_modifier = 1.2
@@ -63,4 +62,4 @@ var/scheduledEvent = null
if(ispath(type))
new type
message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1)
message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1)
+3 -1
View File
@@ -83,7 +83,6 @@
vermstring = "lizards"
if(VERM_SPIDERS)
spawn_types = list(/obj/effect/spider/spiderling)
max_number = 6
vermstring = "spiders"
spawn(0)
@@ -92,6 +91,8 @@
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
if(vermin == VERM_SPIDERS)
var/obj/effect/spider/spiderling/S = new(T)
S.amount_grown = -1
@@ -99,6 +100,7 @@
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/infestation/announce()
command_alert("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Vermin infestation")
+1 -1
View File
@@ -188,7 +188,7 @@
status = "MISSING!"
if(status == "")
status = "OK"
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.getDisplayName(),status),1)
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.display_name,status),1)
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
else
@@ -919,4 +919,33 @@
src.custom_pain("You feel a stabbing pain in your chest!", 1)
E.ruptured_lungs = 1
/*
/mob/living/carbon/human/verb/simulate()
set name = "sim"
set background = 1
var/damage = input("Wound damage","Wound damage") as num
var/germs = 0
var/tdamage = 0
var/ticks = 0
while (germs < 2501 && ticks < 100000 && round(damage/10)*20)
diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
ticks++
if (prob(round(damage/10)*20))
germs++
if (germs == 100)
world << "Reached stage 1 in [ticks] ticks"
if (germs > 100)
if (prob(10))
damage++
germs++
if (germs == 1000)
world << "Reached stage 2 in [ticks] ticks"
if (germs > 1000)
damage++
germs++
if (germs == 2500)
world << "Reached stage 3 in [ticks] ticks"
world << "Mob took [tdamage] tox damage"
*/
+3 -4
View File
@@ -1260,10 +1260,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if("lizard","slime")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("tajaran")
see_in_dark = 4
if("shadow")
if("shadow","tajaran")
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_in_dark = 2
@@ -1403,7 +1402,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/masked = 0
if( istype(head, /obj/item/clothing/head/welding) )
if( istype(head, /obj/item/clothing/head/welding) || istype(head, /obj/item/clothing/head/helmet/space/unathi))
var/obj/item/clothing/head/welding/O = head
if(!O.up && tinted_weldhelh)
client.screen += global_hud.darkMask
@@ -222,6 +222,7 @@ proc/get_damage_icon_part(damage_state, body_part)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
var/plant_color_mod = rgb(144,224,144)
var/necrosis_color_mod = rgb(10,50,0)
var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete
var/fat = (FAT in src.mutations)
@@ -283,6 +284,9 @@ proc/get_damage_icon_part(damage_state, body_part)
temp = new /icon(icobase, "[part.icon_name]")
if(part.status & ORGAN_ROBOT)
temp.GrayScale()
if(part.status & ORGAN_DEAD)
temp.ColorTone(necrosis_color_mod)
temp.SetIntensity(0.7)
else if(!skeleton)
if(husk)
temp.ColorTone(husk_color_mod)
@@ -789,7 +793,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_s")
else if( cur_species == "Soghun")
else if( cur_species == "Unathi")
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_s")
+22 -21
View File
@@ -15,6 +15,9 @@ var/list/department_radio_keys = list(
":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":g" = "changeling", "#g" = "changeling", ".g" = "changeling",
":k" = "skrell", "#k" = "skrell", ".k" = "skrell",
":j" = "tajaran", "#j" = "tajaran", ".j" = "tajaran",
":o" = "soghun", "#o" = "soghun", ".o" = "soghun",
":R" = "right hand", "#R" = "right hand", ".R" = "right hand",
":L" = "left hand", "#L" = "left hand", ".L" = "left hand",
@@ -31,6 +34,9 @@ var/list/department_radio_keys = list(
":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":G" = "changeling", "#G" = "changeling", ".G" = "changeling",
":K" = "skrell", "#K" = "skrell", ".K" = "skrell",
":J" = "tajaran", "#J" = "tajaran", ".J" = "tajaran",
":O" = "soghun", "#O" = "soghun", ".O" = "soghun",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -139,27 +145,6 @@ var/list/department_radio_keys = list(
if (!message)
return
//work out if we're speaking skrell or not
var/is_speaking_skrell = 0
if(copytext(message, 1, 3) == ":k" || copytext(message, 1, 3) == ":K")
message = copytext(message, 3)
if(skrell_talk_understand || universal_speak)
is_speaking_skrell = 1
//work out if we're speaking soghun or not
var/is_speaking_soghun = 0
if(copytext(message, 1, 3) == ":o" || copytext(message, 1, 3) == ":O")
message = copytext(message, 3)
if(soghun_talk_understand || universal_speak)
is_speaking_soghun = 1
//work out if we're speaking soghun or not
var/is_speaking_taj = 0
if(copytext(message, 1, 3) == ":j" || copytext(message, 1, 3) == ":J")
message = copytext(message, 3)
if(tajaran_talk_understand || universal_speak)
is_speaking_taj = 1
// :downs:
if (getBrainLoss() >= 60)
message = replacetext(message, " am ", " ")
@@ -191,6 +176,10 @@ var/list/department_radio_keys = list(
*/
var/list/obj/item/used_radios = new
var/is_speaking_skrell = 0
var/is_speaking_soghun = 0
var/is_speaking_taj = 0
switch (message_mode)
if ("headset")
if (src:ears)
@@ -269,6 +258,18 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
if ("tajaran")
if(tajaran_talk_understand || universal_speak)
is_speaking_taj = 1
if ("soghun")
if(soghun_talk_understand || universal_speak)
is_speaking_soghun = 1
if ("skrell")
if(skrell_talk_understand || universal_speak)
is_speaking_skrell = 1
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
@@ -34,6 +34,13 @@
for(var/mob/M in view())
M << 'sound/effects/mousesqueek.ogg'
if(prob(0.5) && stat == CONSCIOUS)
stat = UNCONSCIOUS
icon_state = "mouse_[color]_sleep"
if(stat == UNCONSCIOUS && prob(1))
stat = CONSCIOUS
icon_state = "mouse_[color]"
/mob/living/simple_animal/mouse/New()
..()
if(!color)
@@ -46,6 +46,13 @@
stance = HOSTILE_STANCE_ATTACK
T = M
break
if(istype(A, /obj/machinery/bot))
var/obj/machinery/bot/B = A
if (B.health > 0)
stance = HOSTILE_STANCE_ATTACK
T = B
break
return T
@@ -88,6 +95,9 @@
var/obj/mecha/M = target_mob
M.attack_animal(src)
return M
if(istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
B.attack_animal(src)
/mob/living/simple_animal/hostile/proc/LoseTarget()
stance = HOSTILE_STANCE_IDLE
@@ -157,7 +157,7 @@
hostile_drone = 0
walk(src,0)
/mob/living/simple_animal/Die()
/mob/living/simple_animal/hostile/retaliate/malf_drone/Die()
src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
..()
del(src)
@@ -452,4 +452,8 @@
var/obj/mecha/M = target_mob
if (M.occupant)
return (0)
if (istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
if(B.health > 0)
return (0)
return (1)
+4 -2
View File
@@ -134,7 +134,7 @@ proc/hasorgans(A)
zone = "head"
if("mouth")
zone = "head"
if("l_hand")
/* if("l_hand")
zone = "l_arm"
if("r_hand")
zone = "r_arm"
@@ -144,6 +144,7 @@ proc/hasorgans(A)
zone = "r_leg"
if("groin")
zone = "chest"
*/
return zone
@@ -171,7 +172,7 @@ proc/hasorgans(A)
// you can only miss if your target is standing and not restrained
if(!target.buckled && !target.lying)
var/miss_chance = max(10 + miss_chance_mod, 0)
var/miss_chance = 10
switch(zone)
if("head")
miss_chance = 40
@@ -191,6 +192,7 @@ proc/hasorgans(A)
miss_chance = 50
if("r_foot")
miss_chance = 50
miss_chance = max(miss_chance + miss_chance_mod, 0)
if(prob(miss_chance))
if(prob(70))
return null
+1 -1
View File
@@ -338,7 +338,7 @@
if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist)
new_character.dna.mutantrace = "tajaran"
new_character.tajaran_talk_understand = 1
if(client.prefs.species == "Soghun")
if(client.prefs.species == "Unathi")
if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist)
new_character.dna.mutantrace = "lizard"
new_character.soghun_talk_understand = 1
@@ -138,7 +138,7 @@ datum/preferences
if(species == "Tajaran")
preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s")
preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY)
else if(species == "Soghun")
else if(species == "Unathi")
preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s")
preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY)
else if(species == "Skrell")
@@ -48,7 +48,7 @@
name = "Bald"
icon_state = "bald"
gender = MALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
short
name = "Short Hair" // try to capatilize the names please~
@@ -119,7 +119,7 @@
name = "Pompadour"
icon_state = "hair_pompadour"
gender = MALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
quiff
name = "Quiff"
@@ -142,19 +142,19 @@
name = "Beehive"
icon_state = "hair_beehive"
gender = FEMALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
gender = FEMALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
bob
name = "Bob"
icon_state = "hair_bobcut"
gender = FEMALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
bowl
name = "Bowl"
@@ -165,7 +165,7 @@
name = "Buzzcut"
icon_state = "hair_buzzcut"
gender = MALE
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
crew
name = "Crewcut"
@@ -227,7 +227,7 @@
mohawk
name = "Mohawk"
icon_state = "hair_d"
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
jensen
name = "Adam Jensen Hair"
icon_state = "hair_jensen"
@@ -241,7 +241,7 @@
spiky
name = "Spiky"
icon_state = "hair_spikey"
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
kusangi
name = "Kusanagi Hair"
icon_state = "hair_kusanagi"
@@ -306,7 +306,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list("Human","Soghun","Tajaran","Skrell")
species_allowed = list("Human","Unathi","Tajaran","Skrell")
watson
name = "Watson Mustache"
@@ -347,7 +347,7 @@
elvis
name = "Elvis Sideburns"
icon_state = "facial_elvis"
species_allowed = list("Human","Soghun")
species_allowed = list("Human","Unathi")
abe
name = "Abraham Lincoln Beard"
@@ -382,11 +382,30 @@
*/
/datum/sprite_accessory/hair
tentacle_m
name = "Skrell Male Tentacles"
icon_state = "skrell_hair_m"
species_allowed = list("Skrell")
gender = MALE
spines_long
name = "Long Unathi Spines"
icon_state = "soghun_longspines"
species_allowed = list("Unathi")
spines_short
name = "Short Unathi Spines"
icon_state = "soghun_shortspines"
species_allowed = list("Unathi")
frills_long
name = "Long Unathi Frills"
icon_state = "soghun_longfrills"
species_allowed = list("Unathi")
frills_short
name = "Short Unathi Frills"
icon_state = "soghun_shortfrill"
species_allowed = list("Unathi")
horns
name = "Unathi Horns"
icon_state = "soghun_horns"
species_allowed = list("Unathi")
tentacle_f
name = "Skrell Female Tentacles"
@@ -499,6 +518,7 @@
name = "Smallsatche"
icon_state = "facial_smallstache"
species_allowed = list("Tajaran")
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
@@ -521,11 +541,11 @@
icon = 'icons/mob/human_races/r_tajaran.dmi'
species_allowed = list("Tajaran")
soghun
name = "Default soghun skin"
unathi
name = "Default Unathi skin"
icon_state = "default"
icon = 'icons/mob/human_races/r_lizard.dmi'
species_allowed = list("Soghun")
species_allowed = list("Unathi")
skrell
name = "Default skrell skin"
+1 -1
View File
@@ -50,7 +50,7 @@
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
if(M.client && M.client.holder && M.client.holder.rights & R_ADMIN && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
else if(M.stat == DEAD)
M.show_message(rendered, 2) //Takes into account blindness and such.
@@ -43,14 +43,14 @@
toxmob(A)
if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/)))
A:energy += energy
else if( istype(A,/obj/machinery/rust/particle_catcher) )
var/obj/machinery/rust/particle_catcher/collided_catcher = A
else if( istype(A,/obj/effect/rust_particle_catcher) )
var/obj/effect/rust_particle_catcher/collided_catcher = A
if(particle_type && particle_type != "neutron")
if(collided_catcher.AddParticles(particle_type, 1 + additional_particles))
collided_catcher.parent.AddEnergy(energy,mega_energy)
del (src)
else if( istype(A,/obj/machinery/rust/core) )
var/obj/machinery/rust/core/collided_core = A
else if( istype(A,/obj/machinery/power/rust_core) )
var/obj/machinery/power/rust_core/collided_core = A
if(particle_type && particle_type != "neutron")
if(collided_core.AddParticles(particle_type, 1 + additional_particles))
var/energy_loss_ratio = abs(collided_core.owned_field.frequency - frequency) / 1e9
+27 -4
View File
@@ -1,3 +1,7 @@
#define SPEEDLOADER 0
#define FROM_BOX 1
#define MAGAZINE 2
/obj/item/weapon/gun/projectile
desc = "A classic revolver. Uses 357 ammo"
name = "revolver"
@@ -10,7 +14,7 @@
var/ammo_type = "/obj/item/ammo_casing/a357"
var/list/loaded = list()
var/max_shells = 7
var/load_method = 0 //0 = Single shells or quick loader, 1 = box, 2 = magazine
var/load_method = SPEEDLOADER //0 = Single shells or quick loader, 1 = box, 2 = magazine
var/obj/item/ammo_magazine/empty_mag = null
@@ -45,7 +49,7 @@
var/num_loaded = 0
if(istype(A, /obj/item/ammo_magazine))
if((load_method == 2) && loaded.len) return
if((load_method == MAGAZINE) && loaded.len) return
var/obj/item/ammo_magazine/AM = A
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
if(loaded.len >= max_shells)
@@ -55,11 +59,11 @@
AM.stored_ammo -= AC
loaded += AC
num_loaded++
if(load_method == 2)
if(load_method == MAGAZINE)
user.remove_from_mob(AM)
empty_mag = AM
empty_mag.loc = src
if(istype(A, /obj/item/ammo_casing) && !load_method)
if(istype(A, /obj/item/ammo_casing) && load_method == SPEEDLOADER)
var/obj/item/ammo_casing/AC = A
if(AC.caliber == caliber && loaded.len < max_shells)
user.drop_item()
@@ -72,6 +76,25 @@
update_icon()
return
/obj/item/weapon/gun/projectile/attack_self(mob/user as mob)
if (loaded.len)
if (load_method == SPEEDLOADER)
var/obj/item/ammo_casing/AC = loaded[1]
loaded -= AC
AC.loc = get_turf(src) //Eject casing onto ground.
user << "\blue You unload shell from \the [src]!"
if (load_method == MAGAZINE)
var/obj/item/ammo_magazine/AM = empty_mag
for (var/obj/item/ammo_casing/AC in loaded)
AM.stored_ammo += AC
loaded -= AC
AM.loc = get_turf(src)
empty_mag = null
user << "\blue You unload magazine from \the [src]!"
else
user << "\red Nothing loaded in \the [src]!"
/obj/item/weapon/gun/projectile/examine()
..()
+16 -20
View File
@@ -74,37 +74,34 @@
loc = A.loc
return 0// nope.avi
var/distance = get_dist(original,loc)
var/distance = get_dist(starting,loc)
//Lower accurancy/longer range tradeoff. Distance matters a lot here, so at
// close distance, actually RAISE the chance to hit.
def_zone = get_zone_with_miss_chance(def_zone, M, -30 + 8*distance)
if(silenced)
if(def_zone)
M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
if(!def_zone)
visible_message("\blue \The [src] misses [M] narrowly!")
forcedodge = -1
else
if(!def_zone)
visible_message("\The [src] misses [M] narrowly.")
del(src)
return
if(silenced)
M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
else
visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
if(istype(firer, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src.type]</font>")
msg_admin_attack("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src.type]</font>")
msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG
if(istype(firer, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src.type]</font>")
msg_admin_attack("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src.type]</font>")
msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG
spawn(0)
if(A)
var/permutation = A.bullet_act(src, def_zone) // searches for return value
if(permutation == -1 || forcedodge) // the bullet passes through a dense object!
if (!forcedodge)
forcedodge = A.bullet_act(src, def_zone) // searches for return value
if(forcedodge == -1) // the bullet passes through a dense object!
bumped = 0 // reset bumped variable!
if(istype(A, /turf))
loc = A
@@ -118,7 +115,6 @@
O.bullet_act(src)
for(var/mob/M in A)
M.bullet_act(src, def_zone)
density = 0
invisibility = 101
del(src)
+38 -32
View File
@@ -20,50 +20,56 @@ var/list/beam_master = list()
process()
var/reference = "\ref[src]" //So we do not have to recalculate it a ton
var/first = 1 //So we don't make the overlay in the same tile as the firer
spawn while(src) //Move until we hit something
spawn(0)
while(!bumped) //Move until we hit something
step_towards(src, current) //Move~
if((!( current ) || loc == current)) //If we pass our target
current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
del(src) //Delete if it passes the world edge
return
step_towards(src, current) //Move~
for(var/mob/living/M in loc)
Bump(M) //Bump anyone we touch
if(kill_count < 1)
del(src)
kill_count--
if((!( current ) || loc == current)) //If we pass our target
current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
if(!bumped && !isturf(original))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
del(src) //Delete if it passes the world edge
return
if(!first) //Add the overlay as we pass over tiles
var/target_dir = get_dir(src, current) //So we don't call this too much
if(!first) //Add the overlay as we pass over tiles
var/target_dir = get_dir(src, current) //So we don't call this too much
//If the icon has not been added yet
if( !("[icon_state][target_dir]" in beam_master) )
var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
beam_master["[icon_state][target_dir]"] = I //And cache it!
//If the icon has not been added yet
if( !("[icon_state][target_dir]" in beam_master) )
var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
beam_master["[icon_state][target_dir]"] = I //And cache it!
//Finally add the overlay
src.loc.overlays += beam_master["[icon_state][target_dir]"]
//Finally add the overlay
src.loc.overlays += beam_master["[icon_state][target_dir]"]
//Add the turf to a list in the beam master so they can be cleaned up easily.
if(reference in beam_master)
var/list/turf_master = beam_master[reference]
if("[icon_state][target_dir]" in turf_master)
var/list/turfs = turf_master["[icon_state][target_dir]"]
turfs += loc
else
turf_master["[icon_state][target_dir]"] = list(loc)
//Add the turf to a list in the beam master so they can be cleaned up easily.
if(reference in beam_master)
var/list/turf_master = beam_master[reference]
if("[icon_state][target_dir]" in turf_master)
var/list/turfs = turf_master["[icon_state][target_dir]"]
turfs += loc
else
var/list/turfs = list()
turfs["[icon_state][target_dir]"] = list(loc)
beam_master[reference] = turfs
turf_master["[icon_state][target_dir]"] = list(loc)
else
first = 0
var/list/turfs = list()
turfs["[icon_state][target_dir]"] = list(loc)
beam_master[reference] = turfs
else
first = 0
cleanup(reference)
return
Del()
cleanup("\ref[src]")
..()
proc/cleanup(reference) //Waits .3 seconds then removes the overlay.
src = null
sleep(3)
@@ -0,0 +1,92 @@
Methylphenidate
#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10
/datum/reagent/antidepressant/methylphenidate
name = "Methylphenidate"
id = "methylphenidate"
description = "Improves the ability to concentrate."
reagent_state = LIQUID
color = "#C8A5DC"
custom_metabolism = 0.01
data = 0
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(src.volume <= 0.1) if(data != -1)
data = -1
M << "\red You lose focus.."
else
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
data = world.time
M << "\blue Your mind feels focused and undivided."
..()
return
/datum/chemical_reaction/methylphenidate
name = "Methylphenidate"
id = "methylphenidate"
result = "methylphenidate"
required_reagents = list("mindbreaker" = 1, "hydrogen" = 1)
result_amount = 3
/datum/reagent/antidepressant/citalopram
name = "citalopram"
id = "Citalopram"
description = "Stabilizes the mind a little."
reagent_state = LIQUID
color = "#C8A5DC"
custom_metabolism = 0.01
data = 0
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(src.volume <= 0.1) if(data != -1)
data = -1
M << "\red Your mind feels a little less stable.."
else
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
data = world.time
M << "\blue Your mind feels stable.. a little stable."
..()
return
/datum/chemical_reaction/citalopram
name = "Citalopram"
id = "citalopram"
result = "citalopram"
required_reagents = list("mindbreaker" = 1, "carbon" = 1)
result_amount = 3
/datum/reagent/antidepressant/paroxetine
name = "paroxetine"
id = "Paroxetine"
description = "Stabilizes the mind greatly, but has a chance of adverse effects."
reagent_state = LIQUID
color = "#C8A5DC"
custom_metabolism = 0.01
data = 0
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(src.volume <= 0.1) if(data != -1)
data = -1
M << "\red Your mind feels much less stable.."
else
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
data = world.time
if(prob(90))
M << "\blue Your mind feels much more stable."
else
M << "\red Your mind breaks apart.."
M.hallucination += 200
..()
return
/datum/chemical_reaction/paroxetine
name = "Paroxetine"
id = "paroxetine"
result = "paroxetine"
required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1)
result_amount = 3
+64 -10
View File
@@ -19,6 +19,8 @@ datum
var/list/data = null
var/volume = 0
var/nutriment_factor = 0
var/custom_metabolism = REAGENTS_METABOLISM
var/mildly_toxic = 0
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
@@ -68,7 +70,14 @@ datum
on_mob_life(var/mob/living/M as mob)
if(!istype(M, /mob/living))
return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
// Certain elements in too large amounts cause side-effects
if(mildly_toxic && istype(M, /mob/living/carbon/human/))
var/mob/living/carbon/human/H = M
if(H.side_effects.len == 0)
M.add_side_effect(pick("Headache", "Bad Stomach", "Itch"))
holder.remove_reagent(src.id, custom_metabolism) //By default it slowly disappears.
return
on_move(var/mob/M)
@@ -199,6 +208,7 @@ datum
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
custom_metabolism = 0.01
reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
@@ -309,24 +319,28 @@ datum
description = "A Toxic chemical."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
custom_metabolism = 0.01
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1.5*REM)
// Toxins are really weak, but without being treated, last very long.
M.adjustToxLoss(0.2)
..()
return
cyanide
// Fast and lethal
name = "Cyanide"
id = "cyanide"
description = "A highly toxic chemical."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
custom_metabolism = 0.4
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(3*REM)
M.adjustOxyLoss(3*REM)
M.adjustToxLoss(4)
M.adjustOxyLoss(4)
M.sleeping += 1
..()
return
@@ -405,6 +419,8 @@ datum
reagent_state = LIQUID
color = "#E895CC" // rgb: 232, 149, 204
custom_metabolism = 0.1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(!data) data = 1
@@ -540,12 +556,17 @@ datum
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
custom_metabolism = 0.01
copper
name = "Copper"
id = "copper"
description = "A highly ductile metal."
color = "#6E3B08" // rgb: 110, 59, 8
mildly_toxic = 1
custom_metabolism = 0.01
nitrogen
name = "Nitrogen"
id = "nitrogen"
@@ -553,6 +574,9 @@ datum
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
mildly_toxic = 1
custom_metabolism = 0.01
hydrogen
name = "Hydrogen"
id = "hydrogen"
@@ -560,6 +584,9 @@ datum
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
mildly_toxic = 1
custom_metabolism = 0.01
potassium
name = "Potassium"
id = "potassium"
@@ -567,6 +594,10 @@ datum
reagent_state = SOLID
color = "#A0A0A0" // rgb: 160, 160, 160
mildly_toxic = 1
custom_metabolism = 0.01
mercury
name = "Mercury"
id = "mercury"
@@ -589,6 +620,9 @@ datum
reagent_state = SOLID
color = "#BF8C00" // rgb: 191, 140, 0
mildly_toxic = 1
custom_metabolism = 0.01
carbon
name = "Carbon"
id = "carbon"
@@ -596,6 +630,9 @@ datum
reagent_state = SOLID
color = "#1C1300" // rgb: 30, 20, 0
mildly_toxic = 1
custom_metabolism = 0.01
reaction_turf(var/turf/T, var/volume)
src = null
if(!istype(T, /turf/space))
@@ -634,6 +671,9 @@ datum
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
mildly_toxic = 1
custom_metabolism = 0.01
phosphorus
name = "Phosphorus"
id = "phosphorus"
@@ -641,6 +681,9 @@ datum
reagent_state = SOLID
color = "#832828" // rgb: 131, 40, 40
mildly_toxic = 1
custom_metabolism = 0.01
lithium
name = "Lithium"
id = "lithium"
@@ -826,6 +869,9 @@ datum
reagent_state = LIQUID
color = "#808080" // rgb: 128, 128, 128
mildly_toxic = 1
custom_metabolism = 0.01
nitroglycerin
name = "Nitroglycerin"
id = "nitroglycerin"
@@ -833,6 +879,9 @@ datum
reagent_state = LIQUID
color = "#808080" // rgb: 128, 128, 128
mildly_toxic = 1
custom_metabolism = 0.01
radium
name = "Radium"
id = "radium"
@@ -1403,6 +1452,7 @@ datum
description = "Synaptizine is used to treat various diseases."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.01
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1440,6 +1490,7 @@ datum
description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.05
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1453,6 +1504,7 @@ datum
description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.05
on_mob_life(var/mob/living/M as mob)
if(M.stat == 2.0)
@@ -1471,6 +1523,7 @@ datum
description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.05
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1516,11 +1569,11 @@ datum
description = "Hyperzine is a highly effective, long lasting, muscle stimulant."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.03
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(5)) M.emote(pick("twitch","blink_r","shiver"))
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
..()
return
@@ -1535,9 +1588,9 @@ datum
if(!M) M = holder.my_atom
if(M.bodytemperature < 170)
M.adjustCloneLoss(-1)
M.adjustOxyLoss(-3)
M.heal_organ_damage(3,3)
M.adjustToxLoss(-3)
M.adjustOxyLoss(-1)
M.heal_organ_damage(1,1)
M.adjustToxLoss(-1)
..()
return
@@ -1564,9 +1617,9 @@ datum
description = "An all-purpose antiviral agent."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
custom_metabolism = 0.01
on_mob_life(var/mob/living/M as mob)//no more mr. panacea
holder.remove_reagent(src.id, 0.2)
on_mob_life(var/mob/living/M as mob)
..()
return
@@ -1612,6 +1665,7 @@ datum
description = "A powerful hallucinogen. Not a thing to be messed with."
reagent_state = LIQUID
color = "#B31008" // rgb: 139, 166, 233
custom_metabolism = 0.05
on_mob_life(var/mob/living/M)
if(!M) M = holder.my_atom
@@ -84,7 +84,7 @@
icon_state = "pill17"
New()
..()
reagents.add_reagent("anti_toxin", 50)
reagents.add_reagent("anti_toxin", 25)
/obj/item/weapon/reagent_containers/pill/tox
name = "Toxins pill"
@@ -134,6 +134,24 @@
..()
reagents.add_reagent("tramadol", 15)
/obj/item/weapon/reagent_containers/pill/methylphenidate
name = "Methylphenidate pill"
desc = "Improves the ability to concentrate."
icon_state = "pill8"
New()
..()
reagents.add_reagent("methylphenidate", 15)
/obj/item/weapon/reagent_containers/pill/citalopram
name = "Citalopram pill"
desc = "Mild anti-depressant."
icon_state = "pill8"
New()
..()
reagents.add_reagent("citalopram", 15)
/obj/item/weapon/reagent_containers/pill/inaprovaline
name = "Inaprovaline pill"
desc = "Used to stabilize patients."
@@ -175,4 +193,4 @@
..()
reagents.add_reagent("impedrezene", 10)
reagents.add_reagent("synaptizine", 5)
reagents.add_reagent("hyperzine", 5)
reagents.add_reagent("hyperzine", 5)
@@ -1,16 +1,4 @@
/obj/item/clothing/suit/bio_suit/anomaly
name = "Anomaly Suit"
desc = "A sealed bio suit capable of resisting exotic alien energies and low pressure environments."
icon_state = "engspace_suit"
item_state = "engspace_suit"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/pickaxe/hand_pick)
/obj/item/clothing/head/bio_hood/anomaly
name = "Anomaly Hood"
desc = "A sealed bio hood capable of resisting exotic alien energies and low pressure environments."
icon_state = "engspace_helmet"
item_state = "engspace_helmet"
/obj/structure/noticeboard/anomaly/New()
notices = 5
icon_state = "nboard05"
+1
View File
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/appendectomy/
priority = 2
can_infect = 1
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+1
View File
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/glue_bone
priority = 2
required_tool = /obj/item/weapon/bonegel
allowed_tools = list(/obj/item/weapon/screwdriver)
can_infect = 1
+1
View File
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/brain/
priority = 2
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return target_zone == "head" && hasorgans(target)
+1
View File
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/eye
priority = 2
can_infect = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target))
+1
View File
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/face
priority = 2
can_infect = 0
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target))
+2 -2
View File
@@ -85,7 +85,7 @@
/datum/surgery_step/generic/retract_skin
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(/obj/item/weapon/crowbar,/obj/item/weapon/kitchen/utensil/fork)
min_duration = 30
max_duration = 40
@@ -186,7 +186,7 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] cuts off [target]'s [affected.display_name] with \the [tool].", \
"\blue You cut off [target]'s [affected.display_name] with \the [tool].")
affected.droplimb(1)
affected.droplimb(1,1)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
+200
View File
@@ -0,0 +1,200 @@
//Procedures in this file: Putting items in body cavity. Implant removal. Items removal.
//////////////////////////////////////////////////////////////////
// ITEM PLACEMENT SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/cavity
priority = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && (target_zone != "chest" || target.op_stage.ribcage == 2)
proc/get_max_wclass(datum/organ/external/affected)
switch (affected.name)
if ("head")
return 1
if ("chest")
return 3
if ("groin")
return 2
return 0
proc/get_cavity(datum/organ/external/affected)
switch (affected.name)
if ("head")
return "cranial"
if ("chest")
return "thoracic"
if ("groin")
return "abdominal"
return ""
/datum/surgery_step/cavity/make_space
required_tool = /obj/item/weapon/surgicaldrill
allowed_tools = list(/obj/item/weapon/pen,/obj/item/stack/rods)
min_duration = 60
max_duration = 80
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
return ..() && !affected.cavity && !affected.hidden
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1)
affected.cavity = 1
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 20)
/datum/surgery_step/cavity/close_space
priority = 2
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
min_duration = 60
max_duration = 80
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
return ..() && affected.cavity
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \
"You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1)
affected.cavity = 0
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
"\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 20)
/datum/surgery_step/cavity/place_item
priority = 0
required_tool = /obj/item
min_duration = 80
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
var/can_fit = !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
return ..() && can_fit
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
target.custom_pain("The pain in your chest is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
if (tool.w_class > get_max_wclass(affected)/2 && prob(50))
user << "\red You tear some vessels trying to fit such big object in this cavity."
var/datum/wound/internal_bleeding/I = new (15)
affected.wounds += I
affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1)
user.drop_item()
affected.hidden = tool
tool.loc = target
affected.cavity = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 20)
//////////////////////////////////////////////////////////////////
// IMPLANT/ITEM REMOVAL SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/cavity/implant_removal
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
min_duration = 80
max_duration = 100
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
"You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
target.custom_pain("The pain in your chest is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
var/find_prob = 0
if (affected.implants.len)
var/obj/item/weapon/implant/imp = affected.implants[1]
if (imp.islegal())
find_prob +=60
else
find_prob +=40
if (isright(tool))
find_prob +=20
if (prob(find_prob))
user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
"\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
affected.implants -= imp
imp.loc = get_turf(target)
imp.imp_in = null
imp.implanted = 0
else if (affected.hidden)
user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
"\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
affected.hidden.loc = get_turf(target)
if(!affected.hidden.blood_DNA)
affected.hidden.blood_DNA = list()
affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
affected.hidden.update_icon()
affected.hidden = null
else
user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
"\blue You could not find anything inside [target]'s [affected.display_name]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 20)
if (affected.implants.len)
var/fail_prob = 10
if (!isright(tool))
fail_prob += 30
if (prob(fail_prob))
var/obj/item/weapon/implant/imp = affected.implants[1]
user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
spawn(25)
imp.activate()
+1 -63
View File
@@ -5,6 +5,7 @@
/datum/surgery_step/fix_vein
priority = 2
required_tool = /obj/item/weapon/FixOVein
allowed_tools = list(/obj/item/weapon/cable_coil)
can_infect = 1
@@ -45,66 +46,3 @@
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
"\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
affected.take_damage(5, 0)
//////////////////////////////////////////////////////////////////
// IMPLANT REMOVAL SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/implant_removal
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
min_duration = 80
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
return affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
"You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
target.custom_pain("The pain in your chest is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
var/find_prob = 0
if (affected.implants.len)
var/obj/item/weapon/implant/imp = affected.implants[1]
if (imp.islegal())
find_prob +=60
else
find_prob +=40
if (isright(tool))
find_prob +=20
if (prob(find_prob))
user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
"\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
var/obj/item/weapon/implant/imp = affected.implants[1]
affected.implants -= imp
imp.loc = get_turf(target)
imp.imp_in = null
imp.implanted = 0
else
user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
"\blue You could not find anything inside [target]'s [affected.display_name]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 20)
if (affected.implants.len)
var/fail_prob = 10
if (!isright(tool))
fail_prob += 30
if (prob(fail_prob))
var/obj/item/weapon/implant/imp = affected.implants[1]
user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
spawn(25)
imp.activate()
+2 -1
View File
@@ -3,6 +3,7 @@
// GENERIC RIBCAGE SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage
priority = 2
can_infect = 1
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -195,4 +196,4 @@
var/datum/organ/external/chest/affected = target.get_organ("chest")
user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
"\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
affected.createwound(CUT, 20)
affected.createwound(CUT, 20)
+17
View File
@@ -1,6 +1,7 @@
/* SURGERY STEPS */
/datum/surgery_step
var/priority = 0 //steps with higher priority would be attempted first
// type path referencing the required tool for this step
var/required_tool = null
@@ -78,6 +79,22 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
return 1 //don't want to do weapony things after surgery
return 0
proc/sort_surgeries()
var/gap = surgery_steps.len
var/swapped = 1
while (gap > 1 || swapped)
swapped = 0
if(gap > 1)
gap = round(gap / 1.247330950103979)
if(gap < 1)
gap = 1
for(var/i = 1; gap + i <= surgery_steps.len; i++)
var/datum/surgery_step/l = surgery_steps[i] //Fucking hate
var/datum/surgery_step/r = surgery_steps[gap+i] //how lists work here
if(l.priority < r.priority)
surgery_steps.Swap(i, gap + i)
swapped = 1
/datum/surgery_status/
var/eyes = 0
var/face = 0