I'm confused

This commit is contained in:
Jazz23
2019-01-14 08:58:22 -08:00
155 changed files with 4985 additions and 338 deletions
+3
View File
@@ -518,6 +518,9 @@
if(ticker.mode.vampire_enthralled.len)
dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled)
if(ticker.mode.devils.len)
dat += check_role_table("Devils", ticker.mode.devils)
if(ticker.mode.xenos.len)
dat += check_role_table("Xenos", ticker.mode.xenos)
+2 -2
View File
@@ -115,14 +115,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
if(!A || !IsValidSrc(A))
to_chat(usr, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
to_chat(src, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
return
message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
to_chat(usr, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
to_chat(src, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -19,7 +19,7 @@
var/checking = FALSE
var/TC_cost = 0
var/borg_to_spawn
var/list/possible_types = list("Assault", "Medical")
var/list/possible_types = list("Assault", "Medical", "Saboteur")
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
if(used)
@@ -43,6 +43,7 @@
var/mob/M = pick(borg_candidates)
var/client/C = M.client
spawn_antag(C, get_turf(src.loc), "syndieborg")
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
@@ -57,6 +58,8 @@
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/syndicate/medical(T)
else if("Saboteur")
R = new /mob/living/silicon/robot/syndicate/saboteur(T)
else
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
R.key = C.key
@@ -9,23 +9,20 @@
anchored = 1
var/obj/item/nanomob_card/card
var/datum/mob_hunt/mob_info
var/obj/effect/landmark/battle_mob_point/avatar_point
var/obj/effect/nanomob/battle/avatar
var/ready = 0
var/team = "Grey"
var/avatar_x_offset = 4
var/avatar_y_offset = 0
/obj/machinery/computer/mob_battle_terminal/red
pixel_y = 24
dir = SOUTH
team = "Red"
avatar_y_offset = -1
/obj/machinery/computer/mob_battle_terminal/blue
pixel_y = -24
dir = NORTH
team = "Blue"
avatar_y_offset = 1
/obj/machinery/computer/mob_battle_terminal/red/Initialize()
..()
@@ -94,7 +91,11 @@
/obj/machinery/computer/mob_battle_terminal/proc/update_avatar()
//if we don't have avatars yet, spawn them
if(!avatar)
avatar = new(locate((x + avatar_x_offset), (y + avatar_y_offset), z))
if(!avatar_point)
log_debug("[src] attempted to spawn a battle mob avatar without a spawn point!")
return
else
avatar = new(get_turf(avatar_point))
//update avatar info from card
if(mob_info)
avatar.mob_info = mob_info
@@ -211,6 +212,29 @@
if(SSmob_hunt && !SSmob_hunt.blue_terminal)
SSmob_hunt.blue_terminal = src
find_avatar_spawn_point()
/obj/machinery/computer/mob_battle_terminal/proc/find_avatar_spawn_point()
if(avatar_point)
return
var/obj/effect/landmark/battle_mob_point/closest
for(var/obj/effect/landmark/battle_mob_point/bmp in GLOB.landmarks_list)
if(!istype(bmp, /obj/effect/landmark/battle_mob_point))
continue
if(bmp.z != z) //only match with points on the same z-level)
continue
if(!closest || isnull(closest))
closest = bmp
continue
if(closest == bmp)
continue
if((abs(x-bmp.x)+abs(y-bmp.y)) < (abs(x-closest.x)+abs(y-closest.y))) //get_dist would be preferable if it didn't count diagonals as 1 distance, so we have to rely on actual x/y distances in this janky way.
closest = bmp
if(closest)
avatar_point = closest
else
log_debug("[src] was unable to locate a nearby mob battle landmark! Unable to spawn battle avatars!")
/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
if(!ready) //no attacking if you arent ready to fight (duh)
return
+6
View File
@@ -276,6 +276,12 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/griffin
cost = 125
/datum/prize_item/codex_gigas
name = "Toy Codex Gigas"
desc = "For helping you come up with writing ideas for your diabolical adventures."
typepath = /obj/item/toy/codex_gigas/
cost = 75
/datum/prize_item/esword
name = "Toy Energy Sword"
desc = "A plastic replica of an energy blade."
+4 -4
View File
@@ -351,7 +351,7 @@
/obj/effect/mob_spawn/human/clown/Initialize()
mob_name = pick(GLOB.clown_names)
..()
return ..()
/obj/effect/mob_spawn/human/corpse/clownmili
name = "Clown Soldier"
@@ -359,7 +359,7 @@
/obj/effect/mob_spawn/human/corpse/clownmili/Initialize()
mob_name = "Officer [pick(GLOB.clown_names)]"
..()
return ..()
/obj/effect/mob_spawn/human/corpse/clownoff
name = "Clown Officer"
@@ -367,7 +367,7 @@
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
mob_name = "Honk Specialist [pick(GLOB.clown_names)]"
..()
return ..()
/datum/outfit/clownsoldier
@@ -398,7 +398,7 @@
/obj/effect/mob_spawn/human/mime/Initialize()
mob_name = pick(GLOB.mime_names)
..()
return ..()
/obj/effect/mob_spawn/human/scientist
name = "Scientist"
+3 -2
View File
@@ -17,8 +17,8 @@ You can set verify to TRUE if you want send() to sleep until the client has the
//When sending mutiple assets, how many before we give the client a quaint little sending resources message
#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
/client
var/list/cache = list() // List of all assets sent to this client by the asset cache.
@@ -191,6 +191,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
"large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png',
"large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png',
"large_stamp-magistrate.png"= 'icons/paper_icons/large_stamp-magistrate.png',
"talisman.png" = 'icons/paper_icons/talisman.png',
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
)
@@ -23,6 +23,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ROLE_NINJA = 21,
ROLE_GSPIDER = 21,
ROLE_ABDUCTOR = 30,
ROLE_DEVIL = 14
)
/proc/player_old_enough_antag(client/C, role)
+6
View File
@@ -20,6 +20,12 @@
icon_state = "pwig"
item_state = "pwig"
/obj/item/clothing/head/justice_wig
name = "Justice wig"
desc = "A fancy powdered wig given to arbitrators of the law. It looks itchy."
icon_state = "jwig"
item_state = "jwig"
/obj/item/clothing/head/beret/blue
icon_state = "beret_blue"
+20 -1
View File
@@ -145,6 +145,19 @@
..()
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder."
/obj/item/clothing/under/rank/centcom/magistrate
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears \"N.S.S. Cyberiad\" on the left shoulder."
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
displays_id = 0
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/magistrate/New()
..()
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears [station_name()] on the left shoulder."
/obj/item/clothing/under/rank/centcom/diplomatic
desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps."
name = "\improper Nanotrasen Diplomatic Uniform"
@@ -798,7 +811,6 @@
flags = NODROP
has_sensor = 0 // HUNKE
/obj/item/clothing/under/victdress
name = "black victorian dress"
desc = "A victorian style dress, fancy!"
@@ -840,3 +852,10 @@
item_state = "medicalgown"
item_color = "medicalgown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
icon_state = "burial"
item_state = "burial"
item_color = "burial"
+7
View File
@@ -1597,3 +1597,10 @@
item_color = "Xann_necklace"
slot_flags = SLOT_TIE
/obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura
name = "Rara's Somber Accordion"
desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins."
icon = 'icons/obj/custom_items.dmi'
icon_state = "asmer_accordion"
item_state = "asmer_accordion"
+1 -1
View File
@@ -194,7 +194,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 180, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Floor Cluwne", /datum/event/spawn_floor_cluwne, 15, is_one_shot = 1)
+17 -13
View File
@@ -6,7 +6,7 @@ var/global/list/unused_trade_stations = list("sol")
/datum/event/traders
var/success_spawn = 0
var/station = null
var/spawn_count = 3
var/spawn_count = 2
var/list/trader_objectives = list()
/datum/event/traders/setup()
@@ -16,6 +16,10 @@ var/global/list/unused_trade_stations = list("sol")
/datum/event/traders/start()
if(!station) // If there are no unused stations, just no.
return
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
event_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
return
var/list/spawnlocs = list()
for(var/obj/effect/landmark/landmark in GLOB.landmarks_list)
if(landmark.name == "traderstart_[station]")
@@ -35,6 +39,7 @@ var/global/list/unused_trade_stations = list("sol")
var/turf/picked_loc = spawnlocs[index]
index++
var/mob/C = pick_n_take(candidates)
spawn_count--
if(C)
GLOB.respawnable_list -= C.client
var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc)
@@ -44,7 +49,9 @@ var/global/list/unused_trade_stations = list("sol")
M.mind.objectives += trader_objectives
greet_trader(M)
success_spawn = 1
if(!success_spawn)
if(success_spawn)
event_announcement.Announce("A trading shuttle from Jupiter Station has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
else
unused_trade_stations += station // Return the station to the list of usable stations.
/datum/event/traders/proc/greet_trader(var/mob/living/carbon/human/M)
@@ -55,17 +62,14 @@ var/global/list/unused_trade_stations = list("sol")
show_objectives(M.mind)
/datum/event/traders/proc/forge_trader_objectives()
var/i = 1
var/max_objectives = pick(2, 2, 2, 2, 3, 3, 3, 4)
var/list/objs = list()
var/list/goals = list("stockparts")
while(i<= max_objectives)
var/goal = pick(goals)
var/datum/objective/trade/O
if(goal == "stockparts")
O = new /datum/objective/trade/stock(station)
O.choose_target()
objs += O
i++
var/datum/objective/trade/plasma/P = new /datum/objective/trade/plasma
P.choose_target()
objs += P
var/datum/objective/trade/credits/C = new /datum/objective/trade/credits
C.choose_target()
objs += C
return objs
+16 -9
View File
@@ -30,15 +30,19 @@
if(!contains_sample)
for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] == 1)
mind = bloodSample.data["mind"]
ckey = bloodSample.data["ckey"]
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
contains_sample = 1
var/datum/mind/tempmind = bloodSample.data["mind"]
if(tempmind.is_revivable())
mind = bloodSample.data["mind"]
ckey = bloodSample.data["ckey"]
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
contains_sample = 1
else
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
else
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
else
@@ -80,6 +84,9 @@
ckey_holder = M.ckey
break
if(mind && !mind.is_revivable())
make_podman = 0
if(make_podman) //all conditions met!
var/mob/living/carbon/human/diona/podman = new /mob/living/carbon/human/diona(parent.loc)
if(realName)
+53
View File
@@ -0,0 +1,53 @@
/obj/item/book/codex_gigas
name = "Codex Gigas"
icon_state ="demonomicon"
throw_speed = 1
throw_range = 10
burn_state = LAVA_PROOF
author = "Forces beyond your comprehension"
unique = TRUE
title = "The codex gigas"
var/inUse = 0
/obj/item/book/codex_gigas/attack_self(mob/user)
if(!user.has_vision())
return
if(inUse)
to_chat(user,"<span class='notice'>Someone else is reading it.</span>")
return
if(!user.is_literate())
to_chat(user,"<span class='notice'>You don't know how to read.</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.check_acedia())
to_chat(user,"<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>")
return
inUse = 1
var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
var/speed = 300
var/correctness = 85
var/willpower = 95
if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research
speed = 45
correctness = 100
willpower = 100
if(U.job in list("Captain", "Security Officer", "Head of Security", "Detective", "Warden"))
willpower = 99
if(U.job in list("Clown")) // WHO GAVE THE CLOWN A DEMONOMICON? BAD THINGS WILL HAPPEN!
willpower = 25
correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
speed += U.getBrainLoss() * 3
user.visible_message("[user] opens [title] and begins reading intently.")
if(do_after(U, speed, 0, U))
var/usedName = devilName
if(!prob(correctness))
usedName += "x"
var/datum/devilinfo/devil = devilInfo(usedName, 0)
user << browse("Information on [devilName]<br><br><br>[lawlorify[LORE][devil.ban]]<br>[lawlorify[LORE][devil.bane]]<br>[lawlorify[LORE][devil.obligation]]<br>[lawlorify[LORE][devil.banish]]", "window=book")
inUse = 0
sleep(10)
if(!prob(willpower))
U.influenceSin()
onclose(user, "book")
@@ -715,6 +715,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
new_char.key = key
/mob/dead/observer/is_literate()
return TRUE
/mob/dead/observer/proc/open_spawners_menu()
set name = "Mob spawners menu"
set desc = "See all currently available ghost spawners"
+11
View File
@@ -10,3 +10,14 @@
/mob/proc/death(gibbed)
return FALSE
/mob/proc/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("dust-m", animation)
new /obj/effect/decal/cleanable/ash(loc)
QDEL_IN(animation, 15)
+15 -10
View File
@@ -1,4 +1,6 @@
/mob/living/carbon/alien/gib()
if(!death(TRUE) && stat != DEAD)
return FALSE
death(1)
var/atom/movable/overlay/animation = null
notransform = 1
@@ -17,30 +19,33 @@
xgibs(loc)
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/alien/dust()
death(1)
var/atom/movable/overlay/animation = null
if(!death(TRUE) && stat != DEAD)
return FALSE
notransform = 1
canmove = 0
icon = null
invisibility = 101
dust_animation()
new /obj/effect/decal/remains/xeno(loc)
GLOB.dead_mob_list -= src
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/alien/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("dust-a", animation)
new /obj/effect/decal/remains/xeno(loc)
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
/mob/living/carbon/alien/death(gibbed)
// Only execute the below if we successfully died
+7 -1
View File
@@ -119,6 +119,9 @@
return 1
/mob/living/carbon/gib()
. = death(1)
if(!.)
return
for(var/obj/item/organ/internal/I in internal_organs)
if(isturf(loc))
I.remove(src)
@@ -130,7 +133,6 @@
src.stomach_contents.Remove(M)
M.forceMove(get_turf(src))
visible_message("<span class='danger'>[M] bursts out of [src]!</span>")
. = ..()
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0)
if(status_flags & GODMODE) //godmode
@@ -356,11 +358,15 @@
else
to_chat(src, "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>")
if(mind && has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")
if(mind && has_bane(BANE_LIGHT))
mind.disrupt_spells(0)
/mob/living/carbon/proc/tintcheck()
@@ -464,3 +464,12 @@
valid_alt_heads += alternate_head
return valid_alt_heads
/mob/living/carbon/human/proc/scramble_appearance()
scramble(1, src, 100)
real_name = random_name(gender, dna.species.name) //Give them a name that makes sense for their species.
sync_organ_dna(assimilate = 1)
update_body(0)
reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
reset_markings() //...Or markings.
dna.ResetUIFrom(src)
+15 -5
View File
@@ -50,11 +50,16 @@
/mob/living/carbon/human/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
var/atom/movable/overlay/animation = null
notransform = 1
canmove = 0
icon = null
invisibility = 101
dust_animation()
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/human/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
@@ -63,7 +68,6 @@
flick("dust-h", animation)
new dna.species.remains_type(get_turf(src))
QDEL_IN(src, 0)
QDEL_IN(animation, 15)
return TRUE
@@ -88,9 +92,6 @@
return TRUE
/mob/living/carbon/human/death(gibbed)
if(can_die() && !gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD
// Only execute the below if we successfully died
. = ..(gibbed)
if(!.)
@@ -176,3 +177,12 @@
ChangeToHusk()
mutations |= NOCLONE
return
/mob/living/carbon/human/proc/cure_husk()
mutations.Remove(HUSK)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = FALSE
update_body(0)
update_mutantrace(0)
UpdateAppearance() // reset hair from DNA
+52 -2
View File
@@ -4,6 +4,7 @@
voice_name = "unknown"
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
deathgasp_on_death = TRUE
var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
/mob/living/carbon/human/New(loc)
@@ -733,7 +734,7 @@
found_record = 1
if(R.fields["criminal"] == "*Execute*")
to_chat(usr, "<span class='warning'>Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.</span>")
else
else
var/rank
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
@@ -1179,7 +1180,6 @@
restore_all_organs() //Rejuvenate and reset all existing organs.
check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing.
surgeries.Cut() //End all surgeries.
update_revive()
if(!isskeleton(src) && (SKELETON in mutations))
mutations.Remove(SKELETON)
@@ -1942,3 +1942,53 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/proc/special_post_clone_handling()
if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops
makeCluwne()
/mob/living/carbon/human/proc/influenceSin()
var/datum/objective/sintouched/O
switch(rand(1,7))//traditional seven deadly sins... except lust.
if(1) // acedia
log_game("[src] was influenced by the sin of Acedia.")
O = new /datum/objective/sintouched/acedia
if(2) // Gluttony
log_game("[src] was influenced by the sin of gluttony.")
O = new /datum/objective/sintouched/gluttony
if(3) // Greed
log_game("[src] was influenced by the sin of greed.")
O = new /datum/objective/sintouched/greed
if(4) // sloth
log_game("[src] was influenced by the sin of sloth.")
O = new /datum/objective/sintouched/sloth
if(5) // Wrath
log_game("[src] was influenced by the sin of wrath.")
O = new /datum/objective/sintouched/wrath
if(6) // Envy
log_game("[src] was influenced by the sin of envy.")
O = new /datum/objective/sintouched/envy
if(7) // Pride
log_game("[src] was influenced by the sin of pride.")
O = new /datum/objective/sintouched/pride
ticker.mode.sintouched += src.mind
src.mind.objectives += O
var/obj_count = 1
to_chat(src, "<span class='notice> Your current objectives:")
for(var/datum/objective/objective in src.mind.objectives)
to_chat(src, "<B>Objective #[obj_count]</B>: [objective.explanation_text]")
obj_count++
/mob/living/carbon/human/is_literate()
return getBrainLoss() < 100
/mob/living/carbon/human/fakefire(var/fire_icon = "Generic_mob_burning")
if(!overlays_standing[FIRE_LAYER])
overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_icon)
update_icons()
/mob/living/carbon/human/fakefireextinguish()
overlays_standing[FIRE_LAYER] = null
update_icons()
/mob/living/carbon/human/proc/cleanSE() //remove all disabilities/powers
for(var/block = 1; block <= DNA_SE_LENGTH; block++)
dna.SetSEState(block, FALSE, TRUE)
genemutcheck(src, block, null, MUTCHK_FORCED)
dna.UpdateSE()
@@ -224,6 +224,8 @@ emp_act
send_item_attack_message(I, user, hit_area)
var/weakness = check_weakness(I,user)
if(!I.force)
return 0 //item force is zero
@@ -231,12 +233,11 @@ emp_act
var/weapon_sharp = is_sharp(I)
if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee")))
weapon_sharp = 0
if(armor >= 100)
return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
apply_damage(I.force * weakness, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
var/bloody = 0
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
@@ -321,7 +321,7 @@
if(put_in_active_hand(W)) return 1
else if(put_in_inactive_hand(W)) return 1
else
..()
. = ..()
// Return the item currently in the slot ID
/mob/living/carbon/human/get_item_by_slot(slot_id)
@@ -34,6 +34,7 @@
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
skinned_type = /obj/item/stack/sheet/wood
@@ -110,4 +111,4 @@
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
..()
..()
@@ -35,6 +35,7 @@
species_traits = list(LIPS, IS_WHITELISTED)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
has_gender = FALSE
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
@@ -59,4 +60,4 @@
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
"brain" = /obj/item/organ/internal/brain/drask
)
)
@@ -25,6 +25,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
has_gender = FALSE
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -57,4 +58,4 @@
if(R.id == "sacid")
H.reagents.del_reagent(R.id)
return 0
return ..()
return ..()
@@ -39,6 +39,7 @@
flesh_color = "#808D11"
//Default styles for created mobs.
default_hair = "Short Vox Quills"
has_gender = FALSE
default_hair_colour = "#614f19" //R: 97, G: 79, B: 25
butt_sprite = "vox"
@@ -201,4 +202,4 @@
"is huffing oxygen!")
/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
return TRUE
return TRUE
+5
View File
@@ -56,6 +56,9 @@
SetJitter(0)
SetLoseBreath(0)
if(!gibbed && deathgasp_on_death)
emote("deathgasp")
if(suiciding)
mind.suicided = TRUE
clear_fullscreens()
@@ -86,6 +89,8 @@
if(ticker && ticker.mode)
ticker.mode.check_win()
if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate
mind.devilinfo.beginResurrectionCheck(src)
// u no we dead
return TRUE
+2 -2
View File
@@ -3,9 +3,9 @@
set background = BACKGROUND_ENABLED
if(notransform)
return
return 0
if(!loc)
return
return 0
var/datum/gas_mixture/environment = loc.return_air()
if(stat != DEAD)
+35
View File
@@ -940,3 +940,38 @@
return
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
/mob/living/proc/owns_soul()
if(mind)
return mind.soulOwner == mind
return 1
/mob/living/proc/return_soul()
if(mind)
if(mind.soulOwner.devilinfo)//Not sure how this could happen, but whatever.
mind.soulOwner.devilinfo.remove_soul(mind)
mind.soulOwner = mind
mind.damnation_type = 0
/mob/living/proc/has_bane(banetype)
if(mind)
if(mind.devilinfo)
return mind.devilinfo.bane == banetype
return 0
/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
if(mind && mind.devilinfo)
return check_devil_bane_multiplier(weapon, attacker)
return 1
/mob/living/proc/check_acedia()
if(src.mind && src.mind.objectives)
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
return 1
return 0
/mob/living/proc/fakefireextinguish()
return
/mob/living/proc/fakefire()
return
@@ -66,3 +66,5 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/status_effects //a list of all status effects the mob has
var/deathgasp_on_death = FALSE
+11 -10
View File
@@ -22,22 +22,23 @@
if(src) qdel(src)
/mob/living/silicon/dust()
death(1)
var/atom/movable/overlay/animation = null
if(!death(TRUE) && stat != DEAD)
return FALSE
notransform = 1
canmove = 0
icon = null
invisibility = 101
dust_animation()
GLOB.dead_mob_list -= src
QDEL_IN(src, 15)
return TRUE
/mob/living/silicon/dust_animation()
//hmmm
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("dust-r", animation)
new /obj/effect/decal/remains/robot(loc)
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
+15 -16
View File
@@ -1,4 +1,6 @@
/mob/living/silicon/robot/gib()
if(!death(TRUE) && stat != DEAD)
return FALSE
//robots don't die when gibbed. instead they drop their MMI'd brain
var/atom/movable/overlay/animation = null
notransform = 1
@@ -18,38 +20,35 @@
GLOB.living_mob_list -= src
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
QDEL_IN(src, 15)
return TRUE
/mob/living/silicon/robot/dust()
death(1)
var/atom/movable/overlay/animation = null
if(!death(TRUE) && stat != DEAD)
return FALSE
notransform = 1
canmove = 0
icon = null
invisibility = 101
if(mmi)
qdel(mmi) //Delete the MMI first so that it won't go popping out.
GLOB.dead_mob_list -= src
QDEL_IN(src, 15)
return TRUE
/mob/living/silicon/robot/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("dust-r", animation)
new /obj/effect/decal/remains/robot(loc)
if(mmi) qdel(mmi) //Delete the MMI first so that it won't go popping out.
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
/mob/living/silicon/robot/death(gibbed)
if(can_die())
if(!gibbed)
emote("deathgasp")
if(module)
module.handle_death(gibbed)
+1 -55
View File
@@ -10,6 +10,7 @@ var/list/robot_verbs_default = list(
maxHealth = 100
health = 100
universal_understand = 1
deathgasp_on_death = TRUE
var/sight_mode = 0
var/custom_name = ""
@@ -1293,61 +1294,6 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate
base_icon = "syndie_bloodhound"
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
pdahide = 1
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
req_access = list(access_syndicate)
ionpulse = 1
magpulse = 1
lawchannel = "State"
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
/mob/living/silicon/robot/syndicate/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
/mob/living/silicon/robot/syndicate/init()
laws = new /datum/ai_laws/syndicate_override
module = new /obj/item/robot_module/syndicate(src)
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
radio = new /obj/item/radio/borg/syndicate(src)
radio.recalculateChannels()
spawn(5)
if(playstyle_string)
to_chat(src, playstyle_string)
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/medical
base_icon = "syndi-medi"
icon_state = "syndi-medi"
modtype = "Syndicate Medical"
designation = "Syndicate Medical"
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
/mob/living/silicon/robot/syndicate/medical/init()
..()
module = new /obj/item/robot_module/syndicate_medical(src)
/mob/living/silicon/robot/combat
base_icon = "droidcombat"
icon_state = "droidcombat"
@@ -432,6 +432,46 @@
fix_modules()
/obj/item/robot_module/syndicate_saboteur
name = "engineering robot module" //to disguise in examine
module_type = "Malf"
stacktypes = list(
/obj/item/stack/sheet/metal/cyborg = 50,
/obj/item/stack/sheet/glass/cyborg = 50,
/obj/item/stack/sheet/rglass/cyborg = 50,
/obj/item/stack/cable_coil/cyborg = 50,
/obj/item/stack/rods/cyborg = 60,
/obj/item/stack/tile/plasteel = 20
)
/obj/item/robot_module/syndicate_saboteur/New()
..()
modules += new /obj/item/rcd/borg/syndicate(src)
modules += new /obj/item/rpd(src)
modules += new /obj/item/extinguisher(src)
modules += new /obj/item/weldingtool/largetank/cyborg(src)
modules += new /obj/item/screwdriver/cyborg(src)
modules += new /obj/item/wrench/cyborg(src)
modules += new /obj/item/crowbar/cyborg(src)
modules += new /obj/item/wirecutters/cyborg(src)
modules += new /obj/item/multitool/cyborg(src)
modules += new /obj/item/t_scanner(src)
modules += new /obj/item/analyzer(src)
modules += new /obj/item/gripper(src)
modules += new /obj/item/melee/energy/sword/cyborg(src)
modules += new /obj/item/card/emag(src)
modules += new /obj/item/borg_chameleon(src)
modules += new /obj/item/pinpointer/operative(src)
emag = null
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
modules += W
fix_modules()
/obj/item/robot_module/combat
name = "combat robot module"
module_type = "Malf"
@@ -0,0 +1,149 @@
/mob/living/silicon/robot/syndicate
base_icon = "syndie_bloodhound"
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
pdahide = 1
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
req_access = list(access_syndicate)
ionpulse = 1
magpulse = 1
lawchannel = "State"
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
/mob/living/silicon/robot/syndicate/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
/mob/living/silicon/robot/syndicate/init()
laws = new /datum/ai_laws/syndicate_override
module = new /obj/item/robot_module/syndicate(src)
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
radio = new /obj/item/radio/borg/syndicate(src)
radio.recalculateChannels()
spawn(5)
if(playstyle_string)
to_chat(src, playstyle_string)
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/medical
base_icon = "syndi-medi"
icon_state = "syndi-medi"
modtype = "Syndicate Medical"
designation = "Syndicate Medical"
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
/mob/living/silicon/robot/syndicate/medical/init()
..()
module = new /obj/item/robot_module/syndicate_medical(src)
/mob/living/silicon/robot/syndicate/saboteur
base_icon = "syndi-engi"
icon_state = "syndi-engi"
modtype = "Syndicate Saboteur"
designation = "Syndicate Saboteur"
var/mail_destination = 0
var/obj/item/borg_chameleon/cham_proj = null
playstyle_string = "<span class='userdanger'>You are a Syndicate saboteur cyborg!</span><br>\
<b>You are equipped with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your built-in mail tagger will allow you to stealthily traverse the disposal network across the station. \
Your cyborg chameleon projector allows you to assume the appearance of a Nanotrasen engineering cyborg, and undertake covert actions on the station. \
You are able to hijack Nanotrasen cyborgs by emagging their internal components, make sure to flash them first. \
You are armed with a standard energy sword, use it to ambush key targets if needed. Your pinpointer will let you locate fellow nuclear operatives to regroup.\
Be aware that physical contact or taking damage will break your disguise. \
<i>Help the operatives secure the disk at all costs!</i></b>"
/mob/living/silicon/robot/syndicate/saboteur/init()
..()
module = new /obj/item/robot_module/syndicate_saboteur(src)
var/obj/item/borg/upgrade/selfrepair/SR = new /obj/item/borg/upgrade/selfrepair(src)
SR.cyborg = src
SR.icon_state = "selfrepair_off"
var/datum/action/A = new /datum/action/item_action/toggle(SR)
A.Grant(src)
/mob/living/silicon/robot/syndicate/saboteur/verb/modify_name()
set name = "Modify Name"
set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost."
set category = "Saboteur"
rename_self(braintype, TRUE, TRUE)
/mob/living/silicon/robot/syndicate/saboteur/verb/toggle_chameleon()
set name = "Toggle Chameleon Projector"
set desc = "Change your appearance to a Nanotrasen cyborg. Costs power to use and maintain."
set category = "Saboteur"
if(!cham_proj)
for(var/obj/item/borg_chameleon/C in contents)
cham_proj = C
for(var/obj/item/borg_chameleon/C in module.contents)
cham_proj = C
if(!cham_proj)
to_chat(src, "<span class='warning'>Error : No chameleon projector system found.</span>")
return
cham_proj.attack_self(src)
/mob/living/silicon/robot/syndicate/saboteur/verb/set_mail_tag()
set name = "Set Mail Tag"
set desc = "Tag yourself for delivery through the disposals system."
set category = "Saboteur"
var/tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in GLOB.TAGGERLOCATIONS
if(!tag || GLOB.TAGGERLOCATIONS[tag])
mail_destination = 0
return
to_chat(src, "<span class='notice'>You configure your internal beacon, tagging yourself for delivery to '[tag]'.</span>")
mail_destination = GLOB.TAGGERLOCATIONS.Find(tag)
//Auto flush if we use this verb inside a disposal chute.
var/obj/machinery/disposal/D = src.loc
if(istype(D))
to_chat(src, "<span class='notice'>\The [D] acknowledges your signal.</span>")
D.flush_count = D.flush_every_ticks
return
/mob/living/silicon/robot/syndicate/saboteur/attackby()
if(cham_proj)
cham_proj.disrupt(src)
..()
/mob/living/silicon/robot/syndicate/saboteur/attack_hand()
if(cham_proj)
cham_proj.disrupt(src)
..()
/mob/living/silicon/robot/syndicate/saboteur/ex_act()
if(cham_proj)
cham_proj.disrupt(src)
..()
/mob/living/silicon/robot/syndicate/saboteur/emp_act()
if(cham_proj)
cham_proj.disrupt(src)
..()
/mob/living/silicon/robot/syndicate/saboteur/bullet_act()
if(cham_proj)
cham_proj.disrupt(src)
..()
/mob/living/silicon/robot/syndicate/saboteur/attackby()
if(cham_proj)
cham_proj.disrupt(src)
..()
@@ -329,6 +329,9 @@
/mob/living/silicon/is_mechanical()
return 1
/mob/living/silicon/is_literate()
return 1
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
/mob/living/silicon/can_hear()
. = TRUE
@@ -36,7 +36,7 @@
var/target_lastloc //Loc of target when arrested.
var/last_found //There's a delay
var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds?
var/idcheck = 1 //If true, arrest people with no IDs
var/idcheck = 0 //If true, arrest people with no IDs
var/weaponscheck = 1 //If true, arrest people for weapons if they don't have access
var/check_records = 1 //Does it check security records?
var/arrest_type = 0 //If true, don't handcuff
@@ -553,18 +553,11 @@
icon_state = "[lasercolor]ed209-c"
spawn(2)
icon_state = "[lasercolor]ed209[on]"
var/threat = 5
if(istype(C, /mob/living/carbon/human))
C.stuttering = 5
C.Stun(5)
C.Weaken(5)
var/mob/living/carbon/human/H = C
threat = H.assess_threat(src)
else
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_attack_logs(src, C, "Stunned by [src]")
var/threat = C.assess_threat(src)
C.SetStuttering(5)
C.Stun(5)
C.Weaken(5)
add_attack_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -583,4 +576,4 @@
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_handcuffed()
back_to_idle()
back_to_idle()
@@ -247,20 +247,13 @@ Auto Patrol: []"},
icon_state = "[base_icon]-c"
spawn(2)
icon_state = "[base_icon][on]"
var/threat = 5
if(istype(C, /mob/living/carbon/human))
C.stuttering = 5
if(harmbaton) // Bots with harmbaton enabled become shitcurity. - Dave
C.apply_damage(10, BRUTE)
C.Stun(5)
C.Weaken(5)
var/mob/living/carbon/human/H = C
threat = H.assess_threat(src)
else
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_attack_logs(src, C, "Stunned by [src]")
var/threat = C.assess_threat(src)
if(ishuman(C) && harmbaton) // Bots with harmbaton enabled become shitcurity. - Dave
C.apply_damage(10, BRUTE)
C.SetStuttering(5)
C.Stun(5)
C.Weaken(5)
add_attack_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -620,4 +620,4 @@
. = ..(gibbed)
if(!.)
return FALSE
do_sparks(3, 1, src)
do_sparks(3, 1, src)
@@ -20,7 +20,7 @@
regenerate_icons()
/mob/living/simple_animal/pet/death(gibbed)
..()
. = ..()
regenerate_icons()
/mob/living/simple_animal/pet/regenerate_icons(cut_overlays = 1)
@@ -28,4 +28,4 @@
overlays.Cut()
if(collar)
overlays += "[icon_state]collar"
overlays += "[icon_state]tag"
overlays += "[icon_state]tag"
@@ -132,6 +132,23 @@
/mob/living/simple_animal/hostile/poison/bees/worker
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
if(beehome)
if(beehome.bees)
beehome.bees.Remove(src)
beehome = null
return ..()
/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
. = ..()
if(!.)
return
if(beehome)
if(beehome.bees)
beehome.bees.Remove(src)
beehome = null
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
..()
+6
View File
@@ -64,4 +64,10 @@
for(var/s in sharedSoullinks)
var/datum/soullink/S = s
S.sharerRevives(src)
if(mind)
for(var/S in mind.spell_list)
var/obj/effect/proc_holder/spell/spell = S
spell.updateButtonIcon()
return 1
+4 -1
View File
@@ -1146,7 +1146,7 @@ var/list/slot_equipment_priority = list( \
to_chat(host, "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>")
/mob/proc/assess_threat() //For sec bot threat assessment
return
return 5
/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
if(mind)
@@ -1334,3 +1334,6 @@ var/list/slot_equipment_priority = list( \
D = NORTH
setDir(D)
spintime -= speed
/mob/proc/is_literate()
return FALSE
+6 -5
View File
@@ -485,8 +485,6 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
if(A)
if(O.client.prefs && O.client.prefs.UI_style)
A.icon = ui_style2icon(O.client.prefs.UI_style)
if(title)
A.name = title
A.desc = message
A.action = action
A.target = source
@@ -560,7 +558,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
return 1
/mob/proc/rename_self(var/role, var/allow_numbers=0)
/mob/proc/rename_self(var/role, var/allow_numbers = FALSE, var/force = FALSE)
spawn(0)
var/oldname = real_name
@@ -568,8 +566,11 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
var/newname
for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
newname = input(src, "You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname) as text
if((world.time - time_passed) > 1800)
if(force)
newname = input(src, "Pick a new name.", "Name Change", oldname) as text
else
newname = input(src, "You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname) as text
if(((world.time - time_passed) > 1800) && !force)
alert(src, "Unfortunately, more than 3 minutes have passed for selecting your name. If you are a robot, use the Namepick verb; otherwise, adminhelp.", "Name Change")
return //took too long
newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
@@ -382,6 +382,7 @@
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
AnnounceArrival(character, rank, join_message)
callHook("latespawn", list(character))
AddEmploymentContract(character)
if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs)
job_master.prioritized_jobs -= thisjob
@@ -413,6 +414,13 @@
rank = character.mind.role_alt_title
global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
/mob/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)
spawn(30)
for(var/C in employmentCabinets)
var/obj/structure/filingcabinet/employment/employmentCabinet = C
if(!employmentCabinet.virgin)
employmentCabinet.addFile(employee)
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message)
if(ticker.current_state == GAME_STATE_PLAYING)
var/ailist[] = list()
+310
View File
@@ -0,0 +1,310 @@
/* For employment contracts and infernal contracts */
/obj/item/paper/contract
throw_range = 3
throw_speed = 3
var/signed = FALSE
var/datum/mind/target
flags = NOBLUDGEON
/obj/item/paper/contract/proc/update_text()
return
/obj/item/paper/contract/update_icon()
return
/obj/item/paper/contract/employment
icon_state = "paper_words"
signed = TRUE
/obj/item/paper/contract/employment/New(atom/loc, mob/living/nOwner)
. = ..()
if(!nOwner || !nOwner.mind)
qdel(src)
return -1
target = nOwner.mind
update_text()
/obj/item/paper/contract/employment/update_text()
name = "paper- [target] employment contract"
info = "<center>Conditions of Employment</center><BR><BR><BR><BR>This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).<BR>WITNESSETH:<BR>WHEREAS, SLAVE is a natural born human or humanoid, posessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.<BR>WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanant servitude.<BR>NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:<BR>In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.<BR>Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.<BR>Should transfership of a soul not be possible, a lien shall be placed instead.<BR>Signed,<BR><i>[target]</i>"
/obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
var/deconvert = 0
if(M.mind == target && target.soulOwner != target)
if(user.mind && (user.mind.assigned_role == "Internal Affairs Agent"))
deconvert = 25
else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander") || (user.mind.assigned_role == "Magistrate"))
deconvert = 10 // the HoP doesn't have AS much legal training
else
deconvert = 0.0001 // one out of a million
if(prob(deconvert))
M.visible_message("<span class='notice'>[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!</span>")
to_chat(M,"<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
M.return_soul()
return ..()
/obj/item/paper/contract/infernal
var/contractType = 0
burn_state = LAVA_PROOF
var/datum/mind/owner
icon_state = "paper_onfire"
/obj/item/paper/contract/infernal/power
name = "paper- contract for infernal power"
contractType = CONTRACT_POWER
/obj/item/paper/contract/infernal/wealth
name = "paper- contract for unlimited wealth"
contractType = CONTRACT_WEALTH
/obj/item/paper/contract/infernal/prestige
name = "paper- contract for prestige"
contractType = CONTRACT_PRESTIGE
/obj/item/paper/contract/infernal/magic
name = "paper- contract for magical power"
contractType = CONTRACT_MAGIC
/obj/item/paper/contract/infernal/revive
name = "paper- contract of resurrection"
contractType = CONTRACT_REVIVE
/obj/item/paper/contract/infernal/knowledge
name = "paper- contract for knowledge"
contractType = CONTRACT_KNOWLEDGE
/obj/item/paper/contract/infernal/unwilling
name = "paper- infernal contract"
contractType = CONTRACT_UNWILLING
/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
..()
owner = nOwner
target = nTarget
update_text()
/obj/item/paper/contract/infernal/suicide_act(mob/user)
if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
H.visible_message("<span class='suicide'>[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!</span>")
H.adjust_fire_stacks(20)
H.IgniteMob()
return(FIRELOSS)
else
..()
/obj/item/paper/contract/infernal/update_text()
info = "This shouldn't be seen. Error DEVIL:6"
/obj/item/paper/contract/infernal/power/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for infernal power</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/wealth/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for unlimited wealth</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/prestige/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for prestige</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/magic/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for magic</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/revive/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for resurrection</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/knowledge/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for knowledge</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/unwilling/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for slave</B></center><BR><BR><BR>I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/attackby(obj/item/P, mob/living/carbon/human/user, params)
add_fingerprint(user)
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
attempt_signature(user)
else if(istype(P, /obj/item/stamp))
to_chat(user,"<span class='notice'>You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.</span>")
else if(is_hot(P))
user.visible_message("<span class='danger'>[user] brings [P] next to [src], but [src] does not catch fire!</span>", "<span class='danger'>The [src] refuses to ignite!</span>")
else
return ..()
/obj/item/paper/contract/infernal/attack(mob/M, mob/living/user)
add_fingerprint(user)
if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
user.visible_message("<span class='danger'>[user] slices their wrist with [src], and scrawls their name in blood.</span>", "<span class='danger'>You slice your wrist open and scrawl your name in blood.</span>")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/C = user
C.blood_volume = max(0, C.blood_volume - 100)
else
return ..()
/obj/item/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0)
if(!(user.IsAdvancedToolUser() && user.is_literate()))
to_chat(user, "<span class='notice'>You don't know how to read or write.</span>")
return FALSE
if(user.mind != target)
to_chat(user,"<span class='notice'>Your signature simply slides off the sheet, it seems this contract is not meant for you to sign.</span>")
return FALSE
if(!user.mind.hasSoul)
to_chat(user, "<span class='notice'>You lack a soul to sign away!</span>")
if(user.mind.soulOwner == owner)
to_chat(user, "<span class='notice'>This devil already owns your soul, you may not sell it to them again.</span>")
return FALSE
if(contractType == CONTRACT_REVIVE) // :eyes:
to_chat(user,"<span class='notice'>You are already alive, this contract would do nothing.</span>")
return FALSE
if(signed)
to_chat(user,"<span class='notice'>This contract has already been signed. It may not be signed again.</span>")
return FALSE
to_chat(user,"<span class='notice'>You quickly scrawl your name on the contract</span>")
if(FulfillContract(target.current, blood) <= 0)
to_chat(user,"<span class='notice'>But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?</span>")
return TRUE
/obj/item/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
if(target == M.mind && M.stat == DEAD && M.mind.hasSoul && M.mind.soulOwner == M.mind)
if(!ishuman(M))
return
var/mob/living/carbon/human/H = M
var/mob/dead/observer/ghost = M.get_ghost(1)
var/response = "No"
if(ghost)
if(!ghost.client)
return
ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
response = alert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
if(!ghost)
return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes")
ghost.reenter_corpse()
else
response = alert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
if(response == "Yes")
H.revive()
add_attack_logs(user, H, "infernally revived via contract")
user.visible_message("<span class='notice'>With a sudden blaze, [H] stands back up.</span>")
H.fakefire()
FulfillContract(H, 1)//Revival contracts are always signed in blood
spawn(5)
H.fakefireextinguish(TRUE)
else
..()
/obj/item/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
signed = 1
if(!user.mind)
return 0
if(user.mind.soulOwner != user.mind && user.mind.soulOwner.devilinfo) //They already sold their soul to someone else?
user.mind.soulOwner.devilinfo.remove_soul(user.mind) //Then they lose their claim.
user.mind.soulOwner = owner
user.mind.damnation_type = contractType
owner.devilinfo.add_soul(user.mind)
update_text(user.real_name, blood)
to_chat(user, "<span class='notice'>A profound emptiness washes over you as you lose ownership of your soul.</span>")
to_chat(user, "<span class='boldnotice'>This does NOT make you an antagonist if you were not already.</span>")
return 1
/obj/item/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!user.dna)
return -1
user.dna.SetSEState(HULKBLOCK,1)
genemutcheck(user, HULKBLOCK,null,MUTCHK_FORCED)
// Demonic power gives you consequenceless hulk
user.gene_stability += GENE_INSTABILITY_MAJOR
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_body()
var/obj/item/organ/internal/hivelord_core/organ = new /obj/item/organ/internal/hivelord_core
organ.insert(user)
return ..()
/obj/item/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind) // How in the hell could that happen?
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
return ..()
/obj/item/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
var/obj/item/worn = user.wear_id
var/obj/item/card/id/id = null
if(worn)
id = worn.GetID()
if(id)
id.icon_state = "gold"
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
else
id = new /obj/item/card/id/gold(user.loc)
id.registered_name = user.real_name
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
if(worn)
if(istype(worn,/obj/item/pda))
var/obj/item/pda/PDA = worn
PDA.id = id
id.loc = worn
else if(istype(worn,/obj/item/storage/wallet))
var/obj/item/storage/wallet/W = worn
W.front_id = id
id.loc = worn
worn.update_icon()
new /datum/event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the Captain and highest authority on the station. Do not state this law.")
return ..()
/obj/item/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/hellish(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
return ..()
/obj/item/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mutations.Add(XRAY)
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
return ..()
+54
View File
@@ -170,3 +170,57 @@
/obj/structure/filingcabinet/medical/attack_tk()
populate()
..()
/*
* Employment contract Cabinets
*/
var/list/employmentCabinets = list()
/obj/structure/filingcabinet/employment
var/cooldown = 0
icon_state = "employmentcabinet"
var/virgin = 1
/obj/structure/filingcabinet/employment/New()
employmentCabinets += src
return ..()
/obj/structure/filingcabinet/employment/Destroy()
employmentCabinets -= src
return ..()
/obj/structure/filingcabinet/employment/proc/fillCurrent()
//This proc fills the cabinet with the current crew.
for(var/record in data_core.locked)
var/datum/data/record/G = record
if(!G)
continue
if(G.fields["reference"])
addFile(G.fields["reference"])
/obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee)
new /obj/item/paper/contract/employment(src, employee)
/obj/structure/filingcabinet/employment/attack_hand(mob/user)
if(!cooldown)
if(virgin)
fillCurrent()
virgin = 0
cooldown = 1
..()
sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
cooldown = 0
else
to_chat(user, "<span class='warning'>The [src] is jammed, give it a few seconds.</span>")
/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/wrench))
to_chat(user, "<span class='notice'>You begin to [anchored ? "wrench" : "unwrench"] [src].</span>")
if (do_after(user,300,user))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
to_chat(user, "<span class='notice'>You successfully [anchored ? "wrench" : "unwrench"] [src].</span>")
else
return ..()
+20 -10
View File
@@ -62,10 +62,13 @@
icon_state = "paper"
/obj/item/paper/examine(mob/user)
if(in_range(user, src) || istype(user, /mob/dead/observer))
show_content(user)
if(user.is_literate())
if(in_range(user, src) || istype(user, /mob/dead/observer))
show_content(user)
else
to_chat(user, "<span class='notice'>You have to go closer if you want to read it.</span>")
else
to_chat(user, "<span class='notice'>You have to go closer if you want to read it.</span>")
to_chat(user, "<span class='notice'>You don't know how to read.</span>")
/obj/item/paper/proc/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1)
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
@@ -92,6 +95,9 @@
if((CLUMSY in usr.mutations) && prob(50))
to_chat(usr, "<span class='warning'>You cut yourself on the paper.</span>")
return
if(!usr.is_literate())
to_chat(usr, "<span class='notice'>You don't know how to read.</span>")
return
var/n_name = sanitize(copytext(input(usr, "What would you like to label the paper?", "Paper Labelling", name) as text, 1, MAX_MESSAGE_LEN))
if((loc == usr && usr.stat == 0))
name = "[(n_name ? text("[n_name]") : initial(name))]"
@@ -353,13 +359,16 @@
B.update_icon()
else if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
var/obj/item/pen/multi/robopen/RP = P
if(istype(P, /obj/item/pen/multi/robopen) && RP.mode == 2)
RP.RenamePaper(user,src)
if(user.is_literate())
var/obj/item/pen/multi/robopen/RP = P
if(istype(P, /obj/item/pen/multi/robopen) && RP.mode == 2)
RP.RenamePaper(user,src)
else
show_content(user, infolinks = 1)
//openhelp(user)
return
else
show_content(user, infolinks = 1)
//openhelp(user)
return
to_chat(user, "<span class='warning'>You don't know how to write!</span>")
else if(istype(P, /obj/item/stamp))
if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/clipboard) ) && loc.loc != user && user.get_active_hand() != P))
@@ -394,7 +403,8 @@
/obj/item/paper/fire_act()
..()
info = "[stars(info)]"
if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read.
info = "[stars(info)]"
/obj/item/paper/proc/stamp(var/obj/item/stamp/S)
stamps += (!stamps || stamps == "" ? "<HR>" : "") + "<img src=large_[S.icon_state].png>"
+6 -1
View File
@@ -76,7 +76,12 @@
name = "Nanotrasen Representative's rubber stamp"
icon_state = "stamp-rep"
item_color = "rep"
/obj/item/stamp/magistrate
name = "Magistrate's rubber stamp"
icon_state = "stamp-magistrate"
item_color = "rep"
/obj/item/stamp/centcom
name = "Central Command rubber stamp"
icon_state = "stamp-cent"
+3 -3
View File
@@ -316,10 +316,10 @@
if(SSshuttle.supply.mode == SHUTTLE_CALL)
supplyData["shuttle_moving"] = 1
if(!is_station_level(SSshuttle.supply.z))
supplyData["shuttle_loc"] = "station"
if(is_station_level(SSshuttle.supply.z))
supplyData["shuttle_loc"] = "Station"
else
supplyData["shuttle_loc"] = "centcom"
supplyData["shuttle_loc"] = "CentCom"
supplyData["shuttle_time"] = "([SSshuttle.supply.timeLeft(600)] Mins)"
@@ -221,7 +221,7 @@
multiple_sprites = 1
/obj/item/ammo_box/magazine/enforcer
name = "handgun magazine (9mm)"
name = "handgun magazine (9mm rubber)"
icon_state = "enforcer"
ammo_type = /obj/item/ammo_casing/rubber9mm
max_ammo = 8
@@ -250,6 +250,7 @@
return 0
/obj/item/ammo_box/magazine/enforcer/lethal
name = "handgun magazine (9mm)"
ammo_type = /obj/item/ammo_casing/c9mm
/obj/item/ammo_box/magazine/wt550m9
@@ -142,11 +142,10 @@
/obj/item/gun/energy/kinetic_accelerator/experimental
name = "experimental kinetic accelerator"
desc = "A modified, far more dangerous version of the proto-kinetic accelerator, with half the cooldown and twice the modkit space of the standard version."
desc = "A modified version of the proto-kinetic accelerator, with twice the modkit space of the standard version."
icon_state = "kineticgun_h"
item_state = "kineticgun_h"
origin_tech = "combat=5;powerstorage=3;engineering=5"
overheat_time = 8
max_mod_capacity = 200
//Casing
+2 -1
View File
@@ -19,6 +19,7 @@
nodamage = 0
//explosion values
var/exp_devastate = -1
var/exp_heavy = 0
var/exp_light = 2
var/exp_flash = 3
@@ -55,7 +56,7 @@
/obj/item/projectile/magic/fireball/on_hit(var/target)
. = ..()
var/turf/T = get_turf(target)
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
explosion(T, exp_devastate, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
if(ismob(target)) //multiple flavors of pain
var/mob/living/M = target
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
@@ -17,9 +17,12 @@
/datum/reagent/consumable/ethanol/reaction_obj(obj/O, volume)
if(istype(O,/obj/item/paper))
var/obj/item/paper/paperaffected = O
paperaffected.clearpaper()
to_chat(usr, "The solution melts away the ink on the paper.")
if(istype(O,/obj/item/paper/contract/infernal))
to_chat(usr, "The solution ignites on contact with the [O].")
else
var/obj/item/paper/paperaffected = O
paperaffected.clearpaper()
to_chat(usr, "The solution melts away the ink on the paper.")
if(istype(O,/obj/item/book))
if(volume >= 5)
var/obj/item/book/affectedbook = O
@@ -681,11 +681,11 @@
return
var/mob/dead/observer/ghost = M.get_ghost()
if(ghost)
to_chat(ghost, "<span class='ghostalert'>You are attempting to be revived with Strange Reagent. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
to_chat(ghost, "<span class='ghostalert'>A Strange Reagent is infusing your body with life. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
M.visible_message("<span class='notice'>[M] doesn't appear to respond, perhaps try again later?</span>")
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations) && (M.mind && M.mind.is_revivable()))
var/time_dead = world.time - M.timeofdeath
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
M.adjustCloneLoss(50)
@@ -117,6 +117,10 @@
color = "#D0D0D0" // rgb: 208, 208, 208
taste_message = "sub-par bling"
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, volume)
if(M.has_bane(BANE_SILVER))
M.reagents.add_reagent("toxin", volume)
. = ..()
/datum/reagent/aluminum
name = "Aluminum"
@@ -160,6 +164,11 @@
H.blood_volume += 0.8
..()
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, volume)
if(M.has_bane(BANE_IRON) && holder && holder.chem_temp < 150) //If the target is weak to cold iron, then poison them.
M.reagents.add_reagent("toxin", volume)
..()
//foam
/datum/reagent/fluorosurfactant
name = "Fluorosurfactant"
+10 -4
View File
@@ -417,6 +417,9 @@
for(var/mob/living/silicon/robot/drone/D in src)
wrapcheck = 1
for(var/mob/living/silicon/robot/syndicate/saboteur/R in src)
wrapcheck = 1
for(var/obj/item/smallDelivery/O in src)
wrapcheck = 1
@@ -461,7 +464,7 @@
AM.loc = src.loc
AM.pipe_eject(0)
if(!istype(AM,/mob/living/silicon/robot/drone)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z
if(!istype(AM, /mob/living/silicon/robot/drone) && !istype(AM, /mob/living/silicon/robot/syndicate/saboteur)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z
spawn(1)
if(AM)
AM.throw_at(target, 5, 1)
@@ -523,7 +526,7 @@
//Check for any living mobs trigger hasmob.
//hasmob effects whether the package goes to cargo or its tagged destination.
for(var/mob/living/M in D)
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
if(M && M.stat != 2 && !istype(M, /mob/living/silicon/robot/drone) && !istype(M, /mob/living/silicon/robot/syndicate/saboteur))
hasmob = 1
//Checks 1 contents level deep. This means that players can be sent through disposals...
@@ -531,7 +534,7 @@
for(var/obj/O in D)
if(O.contents)
for(var/mob/living/M in O.contents)
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone) && !istype(M, /mob/living/silicon/robot/syndicate/saboteur))
hasmob = 1
// now everything inside the disposal gets put into the holder
@@ -553,6 +556,9 @@
if(istype(AM, /mob/living/silicon/robot/drone))
var/mob/living/silicon/robot/drone/drone = AM
destinationTag = drone.mail_destination
if(istype(AM, /mob/living/silicon/robot/syndicate/saboteur))
var/mob/living/silicon/robot/syndicate/saboteur/S = AM
destinationTag = S.mail_destination
if(istype(AM, /obj/item/shippingPackage) && !hasmob)
var/obj/item/shippingPackage/sp = AM
if(sp.sealed) //only sealed packages get delivered to their intended destination
@@ -1304,7 +1310,7 @@
for(var/atom/movable/AM in contents)
AM.forceMove(loc)
AM.pipe_eject(dir)
if(istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
if(istype(AM,/mob/living/silicon/robot/drone) || istype(AM, /mob/living/silicon/robot/syndicate/saboteur)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
return
spawn(5)
if(QDELETED(AM))
+1 -1
View File
@@ -145,7 +145,7 @@ var/ert_request_answered = FALSE
M.set_species(/datum/species/human, TRUE)
M.dna.ready_dna(M)
M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
M.cleanSE() //No fat/blind/colourblind/epileptic/whatever ERT.
M.overeatduration = 0
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
+1 -2
View File
@@ -156,13 +156,12 @@ var/static/regex/multispin_words = regex("like a record baby")
for(var/V in listeners)
var/mob/living/L = V
/*if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
var/start = findtext(message, L.mind.devilinfo.truename)
listeners = list(L) //let's be honest you're never going to find two devils with the same name
power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
//Cut out the name so it doesn't trigger commands
message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1)
break*/
if(findtext(message, L.real_name) == 1)
specific_listeners += L //focus on those with the specified name
//Cut out the name so it doesn't trigger commands