Merge branch 'master' into upstream-merge-26386
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
F << "<small>[time_stamp()] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
|
||||
|
||||
//ADMINVERBS
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
|
||||
set name = "Investigate"
|
||||
set category = "Admin"
|
||||
if(!holder)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
|
||||
//the procs are cause you can't put the comments in the GLOB var define
|
||||
GLOBAL_PROTECT(admin_verbs_default)
|
||||
GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
|
||||
/proc/AVerbsDefault()
|
||||
GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
|
||||
/world/proc/AVerbsDefault()
|
||||
return list(
|
||||
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
|
||||
/client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/
|
||||
@@ -28,8 +29,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
|
||||
/client/proc/stop_sounds
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_admin)
|
||||
GLOBAL_LIST_INIT(admin_verbs_admin, AVerbsAdmin())
|
||||
/proc/AVerbsAdmin()
|
||||
GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/world/proc/AVerbsAdmin()
|
||||
return list(
|
||||
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
|
||||
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
|
||||
@@ -81,9 +82,7 @@ GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_
|
||||
GLOBAL_PROTECT(admin_verbs_sounds)
|
||||
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound,/client/proc/play_sound,/client/proc/set_round_end_sound))
|
||||
GLOBAL_PROTECT(admin_verbs_fun)
|
||||
GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
|
||||
/proc/AVerbsFun()
|
||||
return list(
|
||||
GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
@@ -105,12 +104,12 @@ GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
|
||||
/client/proc/polymorph_all,
|
||||
/client/proc/show_tip,
|
||||
/client/proc/smite
|
||||
)
|
||||
))
|
||||
GLOBAL_PROTECT(admin_verbs_spawn)
|
||||
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character))
|
||||
GLOBAL_PROTECT(admin_verbs_server)
|
||||
GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
|
||||
/proc/AVerbsServer()
|
||||
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
|
||||
/world/proc/AVerbsServer()
|
||||
return list(
|
||||
/datum/admins/proc/startnow,
|
||||
/datum/admins/proc/restart,
|
||||
@@ -129,8 +128,8 @@ GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
|
||||
/client/proc/toggle_hub
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_debug)
|
||||
GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
|
||||
/proc/AVerbsDebug()
|
||||
GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
|
||||
/world/proc/AVerbsDebug()
|
||||
return list(
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
@@ -166,8 +165,10 @@ GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
|
||||
//citadel code
|
||||
/client/proc/give_humans_genitals,
|
||||
/client/proc/test_mammal_overlays,
|
||||
/client/proc/pump_random_event
|
||||
/client/proc/pump_random_event,
|
||||
/client/proc/cmd_display_init_log
|
||||
)
|
||||
|
||||
GLOBAL_PROTECT(admin_verbs_possess)
|
||||
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release))
|
||||
GLOBAL_PROTECT(admin_verbs_permissions)
|
||||
@@ -177,9 +178,7 @@ GLOBAL_LIST_INIT(admin_verbs_rejuv, list(/client/proc/respawn_character))
|
||||
|
||||
//verbs which can be hidden - needs work
|
||||
GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
|
||||
/proc/AVerbsHideable()
|
||||
return list(
|
||||
GLOBAL_LIST_INIT(admin_verbs_hideable, list(
|
||||
/client/proc/set_ooc,
|
||||
/client/proc/reset_ooc,
|
||||
/client/proc/deadmin,
|
||||
@@ -249,7 +248,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
|
||||
/client/proc/debug_huds,
|
||||
/client/proc/customiseSNPC,
|
||||
/client/proc/resetSNPC,
|
||||
)
|
||||
))
|
||||
|
||||
/client/proc/add_admin_verbs()
|
||||
if(holder)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
diff a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm (rejected hunks)
|
||||
@@ -153,7 +153,8 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/clear_dynamic_transit,
|
||||
/client/proc/toggle_medal_disable,
|
||||
/client/proc/view_runtimes,
|
||||
- /client/proc/pump_random_event
|
||||
+ /client/proc/pump_random_event,
|
||||
+ /client/proc/cmd_display_init_log
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
@@ -251,6 +251,11 @@
|
||||
|
||||
/proc/SDQL_from_objs(list/tree)
|
||||
if("world" in tree)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
return
|
||||
return world
|
||||
return SDQL_expression(world, tree)
|
||||
|
||||
@@ -451,12 +456,17 @@
|
||||
else
|
||||
return null
|
||||
if("world")
|
||||
if(IsAdminAdvancedProcCall())
|
||||
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
return
|
||||
v = world
|
||||
if("global")
|
||||
v = GLOB
|
||||
else
|
||||
return null
|
||||
else if(object == world) // Shitty ass hack kill me.
|
||||
else if(object == GLOB) // Shitty ass hack kill me.
|
||||
v = expression[start]
|
||||
if(long)
|
||||
if(expression[start + 1] == ".")
|
||||
@@ -477,7 +487,7 @@
|
||||
var/list/new_args = list()
|
||||
for(var/arg in arguments)
|
||||
new_args += SDQL_expression(source, arg)
|
||||
if(object == world) // Global proc.
|
||||
if(object == GLOB) // Global proc.
|
||||
procname = "/proc/[procname]"
|
||||
return WrapAdminProcCall(GLOBAL_PROC, procname, new_args)
|
||||
return WrapAdminProcCall(object, procname, new_args)
|
||||
|
||||
@@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
|
||||
|
||||
for(var/admin in admin_keys)
|
||||
if(LAZYLEN(admin_keys) > 1)
|
||||
if(LAZYLEN(message) > 1)
|
||||
message += ", [admin]"
|
||||
else
|
||||
message += "[admin]"
|
||||
|
||||
@@ -721,6 +721,13 @@ GLOBAL_PROTECT(AdminProcCall)
|
||||
|
||||
usr << browse(dat, "window=dellog")
|
||||
|
||||
/client/proc/cmd_display_init_log()
|
||||
set category = "Debug"
|
||||
set name = "Display Initialzie() Log"
|
||||
set desc = "Displays a list of things that didn't handle Initialize() properly"
|
||||
|
||||
usr << browse(replacetext(SSatoms.InitLog(), "\n", "<br>"), "window=initlog")
|
||||
|
||||
/client/proc/debug_huds(i as num)
|
||||
set category = "Debug"
|
||||
set name = "Debug HUDs"
|
||||
|
||||
@@ -4,9 +4,6 @@
|
||||
if(!check_rights(R_SOUNDS))
|
||||
return
|
||||
|
||||
log_admin("[key_name(src)] played sound [S]")
|
||||
message_admins("[key_name_admin(src)] played sound [S]")
|
||||
|
||||
var/freq = 1
|
||||
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
|
||||
freq = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
|
||||
@@ -20,6 +17,16 @@
|
||||
admin_sound.wait = 1
|
||||
admin_sound.repeat = 0
|
||||
admin_sound.status = SOUND_STREAM
|
||||
|
||||
var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel")
|
||||
switch(res)
|
||||
if("Yes")
|
||||
to_chat(world, "An admin played: [S]")
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
log_admin("[key_name(src)] played sound [S]")
|
||||
message_admins("[key_name_admin(src)] played sound [S]")
|
||||
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.client.prefs.toggles & SOUND_MIDI)
|
||||
|
||||
@@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
|
||||
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
|
||||
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
|
||||
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
@@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
admin_delete(A)
|
||||
|
||||
/client/proc/admin_delete(datum/D)
|
||||
var/atom/A = D
|
||||
var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : ""
|
||||
if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [D][coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D][coords]")
|
||||
feedback_add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(isturf(O))
|
||||
var/turf/T = O
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
T.ChangeTurf(T.baseturf)
|
||||
else
|
||||
qdel(O)
|
||||
qdel(D)
|
||||
|
||||
/client/proc/cmd_admin_list_open_jobs()
|
||||
set category = "Admin"
|
||||
|
||||
@@ -662,7 +662,7 @@
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
if (do_after(user, 20*W.toolspeed, target = src))
|
||||
if (buildstage == 1)
|
||||
user <<"<span class='notice'>You remove the air alarm electronics.</span>"
|
||||
to_chat(user, "<span class='notice'>You remove the air alarm electronics.</span>")
|
||||
new /obj/item/weapon/electronics/airalarm( src.loc )
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
buildstage = 0
|
||||
|
||||
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
|
||||
//DEFINITIONS FOR ASSET DATUMS START HERE.
|
||||
|
||||
|
||||
/datum/asset/simple/tgui
|
||||
assets = list(
|
||||
"tgui.css" = 'tgui/assets/tgui.css',
|
||||
@@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/asset/simple/pda
|
||||
assets = list(
|
||||
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
|
||||
@@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
|
||||
)
|
||||
|
||||
/datum/asset/simple/changelog
|
||||
assets = list(
|
||||
"88x31.png" = 'html/88x31.png',
|
||||
"bug-minus.png" = 'html/bug-minus.png',
|
||||
"cross-circle.png" = 'html/cross-circle.png',
|
||||
"hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
|
||||
"image-minus.png" = 'html/image-minus.png',
|
||||
"image-plus.png" = 'html/image-plus.png',
|
||||
"music-minus.png" = 'html/music-minus.png',
|
||||
"music-plus.png" = 'html/music-plus.png',
|
||||
"tick-circle.png" = 'html/tick-circle.png',
|
||||
"wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
|
||||
"spell-check.png" = 'html/spell-check.png',
|
||||
"burn-exclamation.png" = 'html/burn-exclamation.png',
|
||||
"chevron.png" = 'html/chevron.png',
|
||||
"chevron-expand.png" = 'html/chevron-expand.png',
|
||||
"scales.png" = 'html/scales.png',
|
||||
"changelog.css" = 'html/changelog.css'
|
||||
)
|
||||
|
||||
//Registers HTML Interface assets.
|
||||
/datum/asset/HTML_interface/register()
|
||||
for(var/path in typesof(/datum/html_interface))
|
||||
|
||||
@@ -455,8 +455,7 @@
|
||||
if(v in blacklisted_vars)
|
||||
continue
|
||||
vars[v] = initial(vars[v])
|
||||
if(chambered.BB)
|
||||
qdel(chambered.BB)
|
||||
QDEL_NULL(chambered.BB)
|
||||
chambered.newshot()
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE)
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
pockets = /obj/item/weapon/storage/internal/pocket/shoes
|
||||
actions_types = list(/datum/action/item_action/bhop)
|
||||
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
|
||||
var/jumpspeed = 3
|
||||
var/recharging_rate = 60 //default 6 seconds between each dash
|
||||
var/recharging_time = 0 //time until next dash
|
||||
var/jumping = FALSE //are we mid-jump?
|
||||
@@ -198,7 +199,7 @@
|
||||
jumping = TRUE
|
||||
playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1)
|
||||
usr.visible_message("<span class='warning'>[usr] dashes foward into the air!</span>")
|
||||
usr.throw_at(target, jumpdistance, 1, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
|
||||
usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
|
||||
|
||||
/obj/item/clothing/shoes/bhop/proc/hop_end()
|
||||
jumping = FALSE
|
||||
@@ -214,4 +215,4 @@
|
||||
name = "blue performer's boots"
|
||||
desc = "These boots were made for dancing."
|
||||
icon_state = "bsing"
|
||||
put_on_delay = 50
|
||||
put_on_delay = 50
|
||||
|
||||
@@ -334,7 +334,7 @@
|
||||
|
||||
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
|
||||
name = "Vape Naysh shirt"
|
||||
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironicly?"
|
||||
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
|
||||
icon_state = "vapeshirt"
|
||||
item_state = "vapeshirt"
|
||||
|
||||
|
||||
@@ -224,5 +224,5 @@
|
||||
to_chat(user, "<span class='warning'>The rune can only be used on battlemage armour!</span>")
|
||||
return
|
||||
W.current_charges += 8
|
||||
user <<"<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>"
|
||||
to_chat(user, "<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -178,7 +178,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
|
||||
/obj/effect/hallucination/simple/xeno/throw_impact(A)
|
||||
update_icon("alienh_pounce")
|
||||
if(A == target)
|
||||
if(A == target && target.stat!=DEAD)
|
||||
target.Weaken(5)
|
||||
target.visible_message("<span class='danger'>[target] flails around wildly.</span>","<span class ='userdanger'>[name] pounces on you!</span>")
|
||||
|
||||
@@ -286,7 +286,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
bubblegum = new(wall, target)
|
||||
sleep(10) //ominous wait
|
||||
var/charged = FALSE //only get hit once
|
||||
while(get_turf(bubblegum) != landing && target)
|
||||
while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
|
||||
bubblegum.forceMove(get_step_towards(bubblegum, landing))
|
||||
bubblegum.setDir(get_dir(bubblegum, landing))
|
||||
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
|
||||
|
||||
@@ -416,8 +416,8 @@
|
||||
/datum/chemical_reaction/bananahonk
|
||||
name = "Banana Honk"
|
||||
id = "bananahonk"
|
||||
results = list("bananahonk" = 3)
|
||||
required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
|
||||
results = list("bananahonk" = 2)
|
||||
required_reagents = list("laughter" = 1, "cream" = 1)
|
||||
|
||||
/datum/chemical_reaction/silencer
|
||||
name = "Silencer"
|
||||
@@ -542,9 +542,9 @@
|
||||
results = list("chocolate_milk" = 2)
|
||||
required_reagents = list("milk" = 1, "cocoa" = 1)
|
||||
mix_message = "The color changes as the mixture blends smoothly."
|
||||
|
||||
|
||||
/datum/chemical_reaction/eggnog
|
||||
name = "eggnog"
|
||||
id = "eggnog"
|
||||
results = list("eggnog" = 15)
|
||||
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
|
||||
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
|
||||
@@ -45,52 +45,52 @@
|
||||
var/list/effects = list()
|
||||
var/last_change = 0
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/holodeck/Initialize(mapload)
|
||||
. = mapload //late-initialize, area_copy need turfs to have air
|
||||
if(!mapload)
|
||||
..()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
if(ispath(holodeck_type,/area))
|
||||
var/list/possible = get_areas(holodeck_type,subtypes = FALSE)
|
||||
linked = pop(possible)
|
||||
if(ispath(offline_program,/area))
|
||||
var/list/possible = get_areas(offline_program,subtypes = FALSE)
|
||||
offline_program = pop(possible)
|
||||
// the following is necessary for power reasons
|
||||
if(!linked || !offline_program)
|
||||
log_world("No matching holodeck area found")
|
||||
qdel(src)
|
||||
return
|
||||
var/area/AS = get_area(src)
|
||||
if(istype(AS,/area/holodeck))
|
||||
log_world("### MAPPING ERROR")
|
||||
log_world("Holodeck computer cannot be in a holodeck.")
|
||||
log_world("This would cause circular power dependency.")
|
||||
qdel(src) // todo handle constructed computers
|
||||
return //l-lewd...
|
||||
else
|
||||
linked.linked = src // todo detect multiple/constructed computers
|
||||
/obj/machinery/computer/holodeck/LateInitialize()
|
||||
if(ispath(holodeck_type,/area))
|
||||
var/list/possible = get_areas(holodeck_type,subtypes = FALSE)
|
||||
linked = pop(possible)
|
||||
if(ispath(offline_program,/area))
|
||||
var/list/possible = get_areas(offline_program,subtypes = FALSE)
|
||||
offline_program = pop(possible)
|
||||
// the following is necessary for power reasons
|
||||
if(!linked || !offline_program)
|
||||
log_world("No matching holodeck area found")
|
||||
qdel(src)
|
||||
return
|
||||
var/area/AS = get_area(src)
|
||||
if(istype(AS,/area/holodeck))
|
||||
log_world("### MAPPING ERROR")
|
||||
log_world("Holodeck computer cannot be in a holodeck.")
|
||||
log_world("This would cause circular power dependency.")
|
||||
qdel(src) // todo handle constructed computers
|
||||
return //l-lewd...
|
||||
else
|
||||
linked.linked = src // todo detect multiple/constructed computers
|
||||
|
||||
program_cache = list()
|
||||
emag_programs = list()
|
||||
for(var/typekey in subtypesof(program_type))
|
||||
var/area/holodeck/A = locate(typekey)
|
||||
if(!A || A == offline_program)
|
||||
continue
|
||||
if(A.contents.len == 0)
|
||||
continue // not loaded
|
||||
if(A.restricted)
|
||||
emag_programs += A
|
||||
else
|
||||
program_cache += A
|
||||
if(typekey == init_program)
|
||||
load_program(A,force=1)
|
||||
if(random_program && program_cache.len && init_program == null)
|
||||
load_program(pick(program_cache),force=1)
|
||||
else if(!program)
|
||||
load_program(offline_program)
|
||||
program_cache = list()
|
||||
emag_programs = list()
|
||||
for(var/typekey in subtypesof(program_type))
|
||||
var/area/holodeck/A = locate(typekey)
|
||||
if(!A || A == offline_program)
|
||||
continue
|
||||
if(A.contents.len == 0)
|
||||
continue // not loaded
|
||||
if(A.restricted)
|
||||
emag_programs += A
|
||||
else
|
||||
program_cache += A
|
||||
if(typekey == init_program)
|
||||
load_program(A,force=1)
|
||||
if(random_program && program_cache.len && init_program == null)
|
||||
load_program(pick(program_cache),force=1)
|
||||
else if(!program)
|
||||
load_program(offline_program)
|
||||
|
||||
/obj/machinery/computer/holodeck/power_change()
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
diff a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm (rejected hunks)
|
||||
@@ -64,25 +64,26 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/holodeck/Initialize(mapload)
|
||||
- . = mapload //late-initialize, area_copy need turfs to have air
|
||||
- if(!mapload)
|
||||
- ..()
|
||||
- program_cache = list()
|
||||
- emag_programs = list()
|
||||
- for(var/typekey in subtypesof(program_type))
|
||||
- var/area/holodeck/A = locate(typekey)
|
||||
- if(!A || A == offline_program) continue
|
||||
- if(A.contents.len == 0) continue // not loaded
|
||||
- if(A.restricted)
|
||||
- emag_programs += A
|
||||
- else
|
||||
- program_cache += A
|
||||
- if(typekey == init_program)
|
||||
- load_program(A,force=1)
|
||||
- if(random_program && program_cache.len && init_program == null)
|
||||
- load_program(pick(program_cache),force=1)
|
||||
- else if(!program)
|
||||
- load_program(offline_program)
|
||||
+ ..()
|
||||
+ return INITIALIZE_HINT_LATELOAD
|
||||
+
|
||||
+/obj/machinery/computer/holodeck/LateInitialize()
|
||||
+ program_cache = list()
|
||||
+ emag_programs = list()
|
||||
+ for(var/typekey in subtypesof(program_type))
|
||||
+ var/area/holodeck/A = locate(typekey)
|
||||
+ if(!A || A == offline_program) continue
|
||||
+ if(A.contents.len == 0) continue // not loaded
|
||||
+ if(A.restricted)
|
||||
+ emag_programs += A
|
||||
+ else
|
||||
+ program_cache += A
|
||||
+ if(typekey == init_program)
|
||||
+ load_program(A,force=1)
|
||||
+ if(random_program && program_cache.len && init_program == null)
|
||||
+ load_program(pick(program_cache),force=1)
|
||||
+ else if(!program)
|
||||
+ load_program(offline_program)
|
||||
|
||||
/obj/machinery/computer/holodeck/power_change()
|
||||
..()
|
||||
@@ -28,8 +28,8 @@
|
||||
throw_speed = 3
|
||||
throw_range = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("weedkiller", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
|
||||
@@ -50,8 +50,8 @@
|
||||
throw_speed = 3
|
||||
throw_range = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("pestkiller", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
|
||||
@@ -135,8 +135,8 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(1,2,5,10,15,25,50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/Initialize()
|
||||
. = ..()
|
||||
src.pixel_x = rand(-5, 5)
|
||||
src.pixel_y = rand(-5, 5)
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle16"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("eznutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
|
||||
@@ -157,8 +157,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle18"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("left4zednutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
|
||||
@@ -167,8 +167,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle15"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("robustharvestnutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
|
||||
@@ -191,8 +191,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle19"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("weedkiller", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
|
||||
@@ -201,6 +201,6 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle20"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("pestkiller", 50)
|
||||
|
||||
@@ -143,6 +143,15 @@ Librarian
|
||||
/obj/item/soapstone = 1
|
||||
)
|
||||
|
||||
|
||||
/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
H.grant_all_languages(omnitongue=TRUE)
|
||||
|
||||
/*
|
||||
Lawyer
|
||||
*/
|
||||
|
||||
@@ -5,9 +5,11 @@
|
||||
speech_verb = "says"
|
||||
whisper_verb = "whispers"
|
||||
key = "0"
|
||||
flags = TONGUELESS_SPEECH
|
||||
flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD
|
||||
default_priority = 100
|
||||
|
||||
icon_state = "galcom"
|
||||
|
||||
//Syllable Lists
|
||||
/*
|
||||
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
speech_verb = "chitters"
|
||||
ask_verb = "chitters inquisitively"
|
||||
exclaim_verb = "chitters loudly"
|
||||
spans = list(SPAN_ROBOT, "drone")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "d"
|
||||
flags = NO_STUTTER
|
||||
syllables = list(".", "|")
|
||||
@@ -12,3 +12,5 @@
|
||||
space_chance = 0
|
||||
sentence_chance = 0
|
||||
default_priority = 20
|
||||
|
||||
icon_state = "drone"
|
||||
|
||||
@@ -21,6 +21,21 @@
|
||||
var/static/list/scramble_cache = list()
|
||||
var/default_priority = 0 // the language that an atom knows with the highest "default_priority" is selected by default.
|
||||
|
||||
// if you are seeing someone speak popcorn language, then something is wrong.
|
||||
var/icon = 'icons/misc/language.dmi'
|
||||
var/icon_state = "popcorn"
|
||||
|
||||
/datum/language/proc/display_icon(atom/movable/hearer)
|
||||
var/understands = hearer.has_language(src.type)
|
||||
if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands)
|
||||
return FALSE
|
||||
if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/language/proc/get_icon()
|
||||
return "<img class=icon src=\ref[icon] iconstate='[icon_state]'>"
|
||||
|
||||
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
|
||||
if(!syllables || !syllables.len)
|
||||
if(gender==FEMALE)
|
||||
@@ -93,3 +108,13 @@
|
||||
return speech_verb
|
||||
|
||||
#undef SCRAMBLE_CACHE_LEN
|
||||
|
||||
/proc/get_language_instance(langtype)
|
||||
if(!ispath(langtype, /datum/language))
|
||||
return
|
||||
|
||||
if(!GLOB.language_datums[langtype])
|
||||
var/datum/language/langdatum = new langtype
|
||||
GLOB.language_datums[langtype] = langdatum
|
||||
|
||||
. = GLOB.language_datums[langtype]
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
speech_verb = "whistles"
|
||||
ask_verb = "chirps"
|
||||
exclaim_verb = "whistles loudly"
|
||||
spans = list(SPAN_ROBOT, "changeling")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "6"
|
||||
flags = NO_STUTTER
|
||||
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
|
||||
space_chance = 10
|
||||
default_priority = 90
|
||||
|
||||
icon_state = "eal"
|
||||
|
||||
/datum/language/machine/get_random_name()
|
||||
if(prob(70))
|
||||
return "[pick(GLOB.posibrain_names)]-[rand(100, 999)]"
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
speech_verb = "chimpers"
|
||||
ask_verb = "chimpers"
|
||||
exclaim_verb = "screeches"
|
||||
spans = list("monkey")
|
||||
key = "1"
|
||||
space_chance = 100
|
||||
syllables = list("oop", "aak", "chee", "eek")
|
||||
default_priority = 80
|
||||
|
||||
icon_state = "animal"
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
exclaim_verb = "clanks"
|
||||
key = "r"
|
||||
default_priority = 10
|
||||
spans = list(SPAN_ROBOT, "brass")
|
||||
spans = list(SPAN_ROBOT)
|
||||
|
||||
icon_state = "ratvar"
|
||||
|
||||
/datum/language/ratvar/scramble(var/input)
|
||||
. = text2ratvar(input)
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
speech_verb = "warbles"
|
||||
ask_verb = "warbles"
|
||||
exclaim_verb = "warbles"
|
||||
spans = list("slime")
|
||||
key = "k"
|
||||
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
|
||||
default_priority = 70
|
||||
|
||||
icon_state = "slime"
|
||||
|
||||
@@ -4,12 +4,15 @@
|
||||
speech_verb = "tones"
|
||||
ask_verb = "tones inquisitively"
|
||||
exclaim_verb = "tones loudly"
|
||||
spans = list(SPAN_ROBOT, "swarmer")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "s"
|
||||
flags = NO_STUTTER
|
||||
space_chance = 100
|
||||
sentence_chance = 0
|
||||
default_priority = 60
|
||||
|
||||
icon_state = "swarmer"
|
||||
|
||||
// since various flats and sharps are the same,
|
||||
// all non-accidental notes are doubled in the list
|
||||
/* The list with unicode symbols for the accents.
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
speech_verb = "hisses"
|
||||
ask_verb = "hisses"
|
||||
exclaim_verb = "hisses"
|
||||
spans = list("alien")
|
||||
key = "4"
|
||||
syllables = list("sss","sSs","SSS")
|
||||
default_priority = 50
|
||||
|
||||
icon_state = "xeno"
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
return FALSE
|
||||
|
||||
smooth_zlevel(world.maxz)
|
||||
SortAreas()
|
||||
repopulate_sorted_areas()
|
||||
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
@@ -74,6 +74,9 @@
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
|
||||
repopulate_sorted_areas()
|
||||
|
||||
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/output_dir = SOUTH
|
||||
|
||||
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
|
||||
S.loc = loc
|
||||
S.forceMove(loc)
|
||||
var/turf/T = get_step(src,output_dir)
|
||||
if(T)
|
||||
S.loc = T
|
||||
S.forceMove(T)
|
||||
@@ -1,3 +1,5 @@
|
||||
#define SMELT_AMOUNT 10
|
||||
|
||||
/**********************Mineral processing unit console**************************/
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console
|
||||
@@ -10,182 +12,50 @@
|
||||
var/machinedir = EAST
|
||||
speed_process = 1
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/New()
|
||||
..()
|
||||
spawn(7)
|
||||
src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
|
||||
if (machine)
|
||||
machine.CONSOLE = src
|
||||
else
|
||||
qdel(src)
|
||||
/obj/machinery/mineral/processing_unit_console/Initialize()
|
||||
. = ..()
|
||||
machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
|
||||
if (machine)
|
||||
machine.CONSOLE = src
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
|
||||
|
||||
var/dat = "<b>Smelter control console</b><br><br>"
|
||||
//iron
|
||||
if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine)
|
||||
if(machine.ore_iron)
|
||||
if (machine.selected_iron==1)
|
||||
dat += "<A href='?src=\ref[src];sel_iron=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_iron=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Iron: [machine.ore_iron]<br>"
|
||||
else
|
||||
machine.selected_iron = 0
|
||||
|
||||
//sand - glass
|
||||
if(machine.ore_glass)
|
||||
if (machine.selected_glass==1)
|
||||
dat += "<A href='?src=\ref[src];sel_glass=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_glass=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Sand: [machine.ore_glass]<br>"
|
||||
else
|
||||
machine.selected_glass = 0
|
||||
|
||||
//plasma
|
||||
if(machine.ore_plasma)
|
||||
if (machine.selected_plasma==1)
|
||||
dat += "<A href='?src=\ref[src];sel_plasma=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_plasma=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Plasma: [machine.ore_plasma]<br>"
|
||||
else
|
||||
machine.selected_plasma = 0
|
||||
|
||||
//uranium
|
||||
if(machine.ore_uranium)
|
||||
if (machine.selected_uranium==1)
|
||||
dat += "<A href='?src=\ref[src];sel_uranium=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_uranium=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Uranium: [machine.ore_uranium]<br>"
|
||||
else
|
||||
machine.selected_uranium = 0
|
||||
|
||||
//gold
|
||||
if(machine.ore_gold)
|
||||
if (machine.selected_gold==1)
|
||||
dat += "<A href='?src=\ref[src];sel_gold=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_gold=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Gold: [machine.ore_gold]<br>"
|
||||
else
|
||||
machine.selected_gold = 0
|
||||
|
||||
//silver
|
||||
if(machine.ore_silver)
|
||||
if (machine.selected_silver==1)
|
||||
dat += "<A href='?src=\ref[src];sel_silver=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_silver=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Silver: [machine.ore_silver]<br>"
|
||||
else
|
||||
machine.selected_silver = 0
|
||||
|
||||
//diamond
|
||||
if(machine.ore_diamond)
|
||||
if (machine.selected_diamond==1)
|
||||
dat += "<A href='?src=\ref[src];sel_diamond=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_diamond=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Diamond: [machine.ore_diamond]<br>"
|
||||
else
|
||||
machine.selected_diamond = 0
|
||||
|
||||
//bananium
|
||||
if(machine.ore_clown)
|
||||
if (machine.selected_clown==1)
|
||||
dat += "<A href='?src=\ref[src];sel_clown=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_clown=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Bananium: [machine.ore_clown]<br>"
|
||||
else
|
||||
machine.selected_clown = 0
|
||||
|
||||
//titanium
|
||||
if(machine.ore_titanium)
|
||||
if (machine.selected_titanium==1)
|
||||
dat += "<A href='?src=\ref[src];sel_titanium=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_titanium=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Titanium: [machine.ore_titanium]<br>"
|
||||
else
|
||||
machine.selected_titanium = 0
|
||||
|
||||
|
||||
//On or off
|
||||
dat += text("Machine is currently ")
|
||||
if (machine.on==1)
|
||||
dat += text("<A href='?src=\ref[src];set_on=off'>On</A> ")
|
||||
else
|
||||
dat += text("<A href='?src=\ref[src];set_on=on'>Off</A> ")
|
||||
else
|
||||
dat+="---No Materials Loaded---"
|
||||
|
||||
|
||||
user << browse(dat, "window=console_processing_unit")
|
||||
if(!machine)
|
||||
return
|
||||
|
||||
var/dat = machine.get_machine_data()
|
||||
|
||||
var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["sel_iron"])
|
||||
if (href_list["sel_iron"] == "yes")
|
||||
machine.selected_iron = 1
|
||||
else
|
||||
machine.selected_iron = 0
|
||||
if(href_list["sel_glass"])
|
||||
if (href_list["sel_glass"] == "yes")
|
||||
machine.selected_glass = 1
|
||||
else
|
||||
machine.selected_glass = 0
|
||||
if(href_list["sel_plasma"])
|
||||
if (href_list["sel_plasma"] == "yes")
|
||||
machine.selected_plasma = 1
|
||||
else
|
||||
machine.selected_plasma = 0
|
||||
if(href_list["sel_uranium"])
|
||||
if (href_list["sel_uranium"] == "yes")
|
||||
machine.selected_uranium = 1
|
||||
else
|
||||
machine.selected_uranium = 0
|
||||
if(href_list["sel_gold"])
|
||||
if (href_list["sel_gold"] == "yes")
|
||||
machine.selected_gold = 1
|
||||
else
|
||||
machine.selected_gold = 0
|
||||
if(href_list["sel_silver"])
|
||||
if (href_list["sel_silver"] == "yes")
|
||||
machine.selected_silver = 1
|
||||
else
|
||||
machine.selected_silver = 0
|
||||
if(href_list["sel_diamond"])
|
||||
if (href_list["sel_diamond"] == "yes")
|
||||
machine.selected_diamond = 1
|
||||
else
|
||||
machine.selected_diamond = 0
|
||||
if(href_list["sel_clown"])
|
||||
if (href_list["sel_clown"] == "yes")
|
||||
machine.selected_clown = 1
|
||||
else
|
||||
machine.selected_clown = 0
|
||||
if(href_list["sel_titanium"])
|
||||
if (href_list["sel_titanium"] == "yes")
|
||||
machine.selected_titanium = 1
|
||||
else
|
||||
machine.selected_titanium = 0
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(href_list["material"])
|
||||
machine.selected_material = href_list["material"]
|
||||
machine.selected_alloy = null
|
||||
|
||||
if(href_list["alloy"])
|
||||
machine.selected_material = null
|
||||
machine.selected_alloy = href_list["alloy"]
|
||||
|
||||
if(href_list["set_on"])
|
||||
if (href_list["set_on"] == "on")
|
||||
machine.on = 1
|
||||
else
|
||||
machine.on = 0
|
||||
src.updateUsrDialog()
|
||||
machine.on = (href_list["set_on"] == "on")
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/Destroy()
|
||||
machine = null
|
||||
return ..()
|
||||
|
||||
|
||||
/**********************Mineral processing unit**************************/
|
||||
|
||||
|
||||
@@ -196,117 +66,84 @@
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/obj/machinery/mineral/CONSOLE = null
|
||||
var/ore_gold = 0;
|
||||
var/ore_silver = 0;
|
||||
var/ore_diamond = 0;
|
||||
var/ore_glass = 0;
|
||||
var/ore_plasma = 0;
|
||||
var/ore_uranium = 0;
|
||||
var/ore_iron = 0;
|
||||
var/ore_clown = 0;
|
||||
var/ore_adamantine = 0;
|
||||
var/ore_titanium = 0;
|
||||
var/selected_gold = 0
|
||||
var/selected_silver = 0
|
||||
var/selected_diamond = 0
|
||||
var/selected_glass = 0
|
||||
var/selected_plasma = 0
|
||||
var/selected_uranium = 0
|
||||
var/selected_iron = 0
|
||||
var/selected_clown = 0
|
||||
var/selected_titanium = 0
|
||||
var/on = 0 //0 = off, 1 =... oh you know!
|
||||
var/datum/material_container/materials
|
||||
var/on = FALSE
|
||||
var/selected_material = MAT_METAL
|
||||
var/selected_alloy = null
|
||||
var/datum/research/files
|
||||
var/list/categories = list("Alloys")
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Initialize()
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 1)
|
||||
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
|
||||
files = new /datum/research/smelter(src)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Destroy()
|
||||
CONSOLE = null
|
||||
qdel(materials)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
|
||||
if(istype(AM, /obj/item/weapon/ore) && AM.loc == get_step(src, input_dir))
|
||||
process_ore(AM)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/weapon/ore/O)
|
||||
var/material_amount = materials.get_item_material_amount(O)
|
||||
if(!materials.has_space(material_amount))
|
||||
unload_mineral(O)
|
||||
else
|
||||
materials.insert_item(O)
|
||||
qdel(O)
|
||||
if(CONSOLE)
|
||||
CONSOLE.updateUsrDialog()
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/get_machine_data()
|
||||
var/dat = "<b>Smelter control console</b><br><br>"
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
dat += "<span class=\"res_name\">[M.name]: </span>[M.amount] cm³"
|
||||
if (selected_material == mat_id)
|
||||
dat += " <i>Smelting</i>"
|
||||
else
|
||||
dat += " <A href='?src=\ref[CONSOLE];material=[mat_id]'><b>Not Smelting</b></A> "
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<br><br>"
|
||||
dat += "<b>Smelt Alloys</b><br>"
|
||||
|
||||
for(var/v in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[v]
|
||||
dat += "<span class=\"res_name\">[D.name] "
|
||||
if (selected_alloy == D.id)
|
||||
dat += " <i>Smelting</i>"
|
||||
else
|
||||
dat += " <A href='?src=\ref[CONSOLE];alloy=[D.id]'><b>Not Smelting</b></A> "
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<br><br>"
|
||||
//On or off
|
||||
dat += "Machine is currently "
|
||||
if (on)
|
||||
dat += "<A href='?src=\ref[CONSOLE];set_on=off'>On</A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[CONSOLE];set_on=on'>Off</A> "
|
||||
|
||||
return dat
|
||||
|
||||
/obj/machinery/mineral/processing_unit/process()
|
||||
for(var/i in 1 to 10)
|
||||
if (on)
|
||||
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_glass > 0)
|
||||
ore_glass--
|
||||
generate_mineral(/obj/item/stack/sheet/glass)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_glass > 0 && ore_iron > 0)
|
||||
ore_glass--
|
||||
ore_iron--
|
||||
generate_mineral(/obj/item/stack/sheet/rglass)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_gold > 0)
|
||||
ore_gold--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/gold)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_silver > 0)
|
||||
ore_silver--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/silver)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_diamond > 0)
|
||||
ore_diamond--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/diamond)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_plasma > 0)
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/plasma)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_uranium > 0)
|
||||
ore_uranium--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/uranium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_iron > 0)
|
||||
ore_iron--
|
||||
generate_mineral(/obj/item/stack/sheet/metal)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_iron > 0 && ore_plasma > 0)
|
||||
ore_iron--
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/plasteel)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_titanium)
|
||||
if (ore_clown > 0)
|
||||
ore_clown--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/bananium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
|
||||
if (ore_titanium > 0)
|
||||
ore_titanium--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/titanium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
|
||||
if (ore_titanium > 0)
|
||||
ore_titanium--
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/plastitanium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (on)
|
||||
if(selected_material)
|
||||
smelt_ore()
|
||||
|
||||
else if(selected_alloy)
|
||||
smelt_alloy()
|
||||
|
||||
|
||||
if(CONSOLE)
|
||||
CONSOLE.updateUsrDialog()
|
||||
|
||||
|
||||
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
|
||||
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
|
||||
//Even in the dark year of 2016, where /tg/ is dead, Urist still hasn't finished this -Bawhoppennn
|
||||
@@ -327,104 +164,57 @@
|
||||
on = 0
|
||||
continue*/
|
||||
|
||||
|
||||
//if a non valid combination is selected
|
||||
|
||||
var/b = 1 //this part checks if all required ores are available
|
||||
|
||||
if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
|
||||
b = 0
|
||||
|
||||
if (selected_gold == 1)
|
||||
if (ore_gold <= 0)
|
||||
b = 0
|
||||
if (selected_silver == 1)
|
||||
if (ore_silver <= 0)
|
||||
b = 0
|
||||
if (selected_diamond == 1)
|
||||
if (ore_diamond <= 0)
|
||||
b = 0
|
||||
if (selected_uranium == 1)
|
||||
if (ore_uranium <= 0)
|
||||
b = 0
|
||||
if (selected_plasma == 1)
|
||||
if (ore_plasma <= 0)
|
||||
b = 0
|
||||
if (selected_iron == 1)
|
||||
if (ore_iron <= 0)
|
||||
b = 0
|
||||
if (selected_glass == 1)
|
||||
if (ore_glass <= 0)
|
||||
b = 0
|
||||
if (selected_clown == 1)
|
||||
if (ore_clown <= 0)
|
||||
b = 0
|
||||
|
||||
if (b) //if they are, deduct one from each, produce slag and shut the machine off
|
||||
if (selected_gold == 1)
|
||||
ore_gold--
|
||||
if (selected_silver == 1)
|
||||
ore_silver--
|
||||
if (selected_diamond == 1)
|
||||
ore_diamond--
|
||||
if (selected_uranium == 1)
|
||||
ore_uranium--
|
||||
if (selected_plasma == 1)
|
||||
ore_plasma--
|
||||
if (selected_iron == 1)
|
||||
ore_iron--
|
||||
if (selected_clown == 1)
|
||||
ore_clown--
|
||||
generate_mineral(/obj/item/weapon/ore/slag)
|
||||
on = 0
|
||||
else
|
||||
on = 0
|
||||
break
|
||||
break
|
||||
else
|
||||
break
|
||||
var/turf/T = get_step(src,input_dir)
|
||||
if(T)
|
||||
var/n = 0
|
||||
for(var/obj/item/O in T)
|
||||
n++
|
||||
if(n>10)
|
||||
break
|
||||
if (istype(O,/obj/item/weapon/ore/iron))
|
||||
ore_iron++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/glass))
|
||||
ore_glass++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/diamond))
|
||||
ore_diamond++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/plasma))
|
||||
ore_plasma++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/gold))
|
||||
ore_gold++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/silver))
|
||||
ore_silver++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/uranium))
|
||||
ore_uranium++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/bananium))
|
||||
ore_clown++
|
||||
O.loc = null
|
||||
continue
|
||||
unload_mineral(O)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/smelt_ore()
|
||||
var/datum/material/mat = materials.materials[selected_material]
|
||||
if(mat)
|
||||
var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT)
|
||||
if(!sheets_to_remove)
|
||||
on = FALSE
|
||||
else
|
||||
var/out = get_step(src, output_dir)
|
||||
materials.retrieve_sheets(sheets_to_remove, selected_material, out)
|
||||
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
|
||||
var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
|
||||
if(!alloy)
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
var/amount = can_smelt(alloy)
|
||||
|
||||
if(!amount)
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
materials.use_amount(alloy.materials, amount)
|
||||
|
||||
generate_mineral(alloy.build_path)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D)
|
||||
if(D.make_reagents.len)
|
||||
return 0
|
||||
|
||||
var/build_amount = SMELT_AMOUNT
|
||||
|
||||
|
||||
for(var/mat_id in D.materials)
|
||||
var/M = D.materials[mat_id]
|
||||
var/datum/material/smelter_mat = materials.materials[mat_id]
|
||||
|
||||
if(!M || !smelter_mat)
|
||||
return 0
|
||||
|
||||
build_amount = min(build_amount, round(smelter_mat.amount / M))
|
||||
|
||||
return build_amount
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/generate_mineral(P)
|
||||
var/O = new P(src)
|
||||
unload_mineral(O)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/on_deconstruction()
|
||||
materials.retrieve_all()
|
||||
..()
|
||||
|
||||
#undef SMELT_AMOUNT
|
||||
@@ -1,10 +1,12 @@
|
||||
//Dead mobs can exist whenever. This is needful
|
||||
/mob/dead/New(loc)
|
||||
..()
|
||||
if(!initialized)
|
||||
args[1] = FALSE
|
||||
Initialize(arglist(args)) //EXIST DAMN YOU!!!
|
||||
|
||||
INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
|
||||
/mob/dead/Initialize()
|
||||
. = ..()
|
||||
if(config.cross_allowed)
|
||||
verbs += /mob/dead/proc/server_hop
|
||||
|
||||
/mob/dead/dust() //ghosts can't be vaporised.
|
||||
return
|
||||
|
||||
@@ -12,4 +14,29 @@
|
||||
return
|
||||
|
||||
/mob/dead/ConveyorMove() //lol
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/dead/proc/server_hop()
|
||||
set category = "OOC"
|
||||
set name = "Server Hop!"
|
||||
set desc= "Jump to the other server"
|
||||
if(notransform)
|
||||
return
|
||||
if(!config.cross_allowed)
|
||||
verbs -= /mob/dead/proc/server_hop
|
||||
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
|
||||
return
|
||||
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
|
||||
return 0
|
||||
if (client && config.cross_allowed)
|
||||
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
|
||||
new /obj/screen/splash(client)
|
||||
notransform = TRUE
|
||||
sleep(29) //let the animation play
|
||||
notransform = FALSE
|
||||
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
|
||||
client << link(config.cross_address + "?server_hop=[key]")
|
||||
else
|
||||
to_chat(src, "<span class='error'>There is no other server configured!</span>")
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
loc = pick(GLOB.newplayer_start)
|
||||
else
|
||||
loc = locate(1,1,1)
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
|
||||
/mob/dead/new_player/proc/new_player_panel()
|
||||
|
||||
@@ -48,11 +49,11 @@
|
||||
output += "<p><a href='byond://?src=\ref[src];observe=1'>Observe</A></p>"
|
||||
|
||||
if(!IsGuestKey(src.key))
|
||||
if (SSdbcore.Connect())
|
||||
if (SSdbcore.Connect())
|
||||
var/isadmin = 0
|
||||
if(src.client && src.client.holder)
|
||||
isadmin = 1
|
||||
var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
|
||||
var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
|
||||
if(!query_get_new_polls.Execute())
|
||||
return
|
||||
var/newpoll = 0
|
||||
@@ -302,7 +303,7 @@
|
||||
if(!IsJobAvailable(rank))
|
||||
alert(src, "[rank] is not available. Please try another.")
|
||||
return 0
|
||||
|
||||
|
||||
if(SSticker.late_join_disabled)
|
||||
alert(src, "An administrator has disabled late join spawning.")
|
||||
return FALSE
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
diff a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm (rejected hunks)
|
||||
@@ -30,6 +30,7 @@
|
||||
loc = pick(newplayer_start)
|
||||
else
|
||||
loc = locate(1,1,1)
|
||||
+ return INITIALIZE_HINT_NORMAL
|
||||
|
||||
/mob/dead/new_player/proc/new_player_panel()
|
||||
|
||||
@@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
|
||||
verbs += /mob/dead/observer/proc/dead_tele
|
||||
|
||||
if(config.cross_allowed)
|
||||
verbs += /mob/dead/observer/proc/server_hop
|
||||
|
||||
if(icon_state in GLOB.ghost_forms_with_directions_list)
|
||||
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
|
||||
else
|
||||
@@ -355,9 +352,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(!isobserver(usr))
|
||||
to_chat(usr, "Not when you're not dead!")
|
||||
return
|
||||
var/A
|
||||
A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas
|
||||
var/area/thearea = A
|
||||
var/list/filtered = list()
|
||||
for(var/V in GLOB.sortedAreas)
|
||||
var/area/A = V
|
||||
if(!A.hidden)
|
||||
filtered += A
|
||||
var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered
|
||||
|
||||
if(!thearea)
|
||||
return
|
||||
|
||||
@@ -586,29 +587,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
target.faction = list("neutral")
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/proc/server_hop()
|
||||
set category = "Ghost"
|
||||
set name = "Server Hop!"
|
||||
set desc= "Jump to the other server"
|
||||
if(notransform)
|
||||
return
|
||||
if(!config.cross_allowed)
|
||||
verbs -= /mob/dead/observer/proc/server_hop
|
||||
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
|
||||
return
|
||||
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
|
||||
return 0
|
||||
if (client && config.cross_allowed)
|
||||
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
|
||||
new /obj/screen/splash(client)
|
||||
notransform = TRUE
|
||||
sleep(29) //let the animation play
|
||||
notransform = FALSE
|
||||
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
|
||||
client << link(config.cross_address + "?server_hop=[key]")
|
||||
else
|
||||
to_chat(src, "<span class='error'>There is no other server configured!</span>")
|
||||
|
||||
/proc/show_server_hop_transfer_screen(expected_key)
|
||||
//only show it to incoming ghosts
|
||||
for(var/mob/dead/observer/O in GLOB.player_list)
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
if(C.has_brain_worms())
|
||||
var/mob/living/simple_animal/borer/B = C.has_brain_worms()
|
||||
B.leave_victim() //Should remove borer if the brain is removed - RR
|
||||
transfer_identity(C)
|
||||
if(!gc_destroyed || (owner && !owner.gc_destroyed))
|
||||
transfer_identity(C)
|
||||
C.update_hair()
|
||||
|
||||
/obj/item/organ/brain/prepare_eat()
|
||||
@@ -60,6 +61,8 @@
|
||||
name = "[L.name]'s brain"
|
||||
if(brainmob || decoy_override)
|
||||
return
|
||||
if(!L.mind)
|
||||
return
|
||||
brainmob = new(src)
|
||||
brainmob.name = L.real_name
|
||||
brainmob.real_name = L.real_name
|
||||
|
||||
@@ -728,7 +728,7 @@
|
||||
|
||||
/mob/living/carbon/can_be_revived()
|
||||
. = ..()
|
||||
if(!getorgan(/obj/item/organ/brain))
|
||||
if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.changeling))
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/harvest(mob/living/user)
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/mob/living/carbon/human/say_quote(input, spans, message_mode)
|
||||
/mob/living/carbon/human/say_mod(input, message_mode)
|
||||
verb_say = dna.species.say_mod
|
||||
. = ..()
|
||||
if(src.slurring)
|
||||
input = attach_spans(input, spans)
|
||||
return "slurs, \"[input]\""
|
||||
|
||||
if(slurring)
|
||||
return "slurs"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/treat_message(message)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
//Eyes
|
||||
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
|
||||
|
||||
|
||||
//Ears
|
||||
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
|
||||
|
||||
@@ -497,6 +497,8 @@
|
||||
|
||||
var/g = (H.gender == FEMALE) ? "f" : "m"
|
||||
|
||||
var/image/I
|
||||
|
||||
for(var/layer in relevant_layers)
|
||||
var/layertext = mutant_bodyparts_layertext(layer)
|
||||
|
||||
@@ -561,9 +563,9 @@
|
||||
S = /datum/sprite_accessory/slimecoon_snout*/
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
|
||||
|
||||
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
|
||||
|
||||
|
||||
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
|
||||
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "slimecoontail" || bodypart == "xenotail")
|
||||
bodypart = "tail"
|
||||
@@ -574,11 +576,15 @@
|
||||
if(bodypart == "xenohead")
|
||||
bodypart = "xhead"
|
||||
|
||||
var/icon_string
|
||||
|
||||
if(S.gender_specific)
|
||||
accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]"
|
||||
else
|
||||
accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]"
|
||||
|
||||
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
|
||||
|
||||
if(S.center)
|
||||
accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
@@ -624,86 +630,78 @@
|
||||
inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
standing += inner_accessory_overlay
|
||||
|
||||
|
||||
if(S.extra) //apply the extra overlay, if there is one
|
||||
var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
|
||||
if(S.gender_specific)
|
||||
extra_accessory_overlay.icon_state = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]"
|
||||
icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]"
|
||||
else
|
||||
extra_accessory_overlay.icon_state = "m_[bodypart]_extra_[S.icon_state]_[layertext]"
|
||||
icon_string = "m_[bodypart]_extra_[S.icon_state]_[layertext]"
|
||||
|
||||
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
|
||||
|
||||
if(S.center)
|
||||
extra_accessory_overlay.icon_state = center_image(extra_accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
if(!forced_colour)
|
||||
switch(S.extra_color_src) //change the color of the extra overlay
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
extra_accessory_overlay.color = "#[fixed_mut_color]"
|
||||
else
|
||||
extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
if(MUTCOLORS2)
|
||||
if(fixed_mut_color2)
|
||||
extra_accessory_overlay.color = "#[fixed_mut_color2]"
|
||||
else
|
||||
extra_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
|
||||
if(MUTCOLORS3)
|
||||
if(fixed_mut_color3)
|
||||
extra_accessory_overlay.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
extra_accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
|
||||
if(HAIR)
|
||||
if(hair_color == "mutcolor")
|
||||
extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
else
|
||||
extra_accessory_overlay.color = "#[H.hair_color]"
|
||||
if(FACEHAIR)
|
||||
extra_accessory_overlay.color = "#[H.facial_hair_color]"
|
||||
if(EYECOLOR)
|
||||
extra_accessory_overlay.color = "#[H.eye_color]"
|
||||
else
|
||||
extra_accessory_overlay.color = forced_colour
|
||||
standing += extra_accessory_overlay
|
||||
I = center_image(I,S.dimension_x,S.dimension_y)
|
||||
|
||||
switch(S.extra_color_src) //change the color of the extra overlay
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
I.color = "#[fixed_mut_color]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor"]]"
|
||||
if(MUTCOLORS2)
|
||||
if(fixed_mut_color2)
|
||||
I.color = "#[fixed_mut_color2]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor2"]]"
|
||||
if(MUTCOLORS3)
|
||||
if(fixed_mut_color3)
|
||||
I.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor3"]]"
|
||||
if(HAIR)
|
||||
if(hair_color == "mutcolor")
|
||||
I.color = "#[H.dna.features["mcolor"]]"
|
||||
else
|
||||
I.color = "#[H.hair_color]"
|
||||
if(FACEHAIR)
|
||||
I.color = "#[H.facial_hair_color]"
|
||||
if(EYECOLOR)
|
||||
I.color = "#[H.eye_color]"
|
||||
standing += I
|
||||
|
||||
if(S.extra2) //apply the extra overlay, if there is one
|
||||
var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
|
||||
if(S.gender_specific)
|
||||
extra2_accessory_overlay.icon_state = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]"
|
||||
icon_string = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]"
|
||||
else
|
||||
extra2_accessory_overlay.icon_state = "m_[bodypart]_extra2_[S.icon_state]_[layertext]"
|
||||
icon_string = "m_[bodypart]_extra2_[S.icon_state]_[layertext]"
|
||||
|
||||
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
|
||||
|
||||
if(S.center)
|
||||
extra2_accessory_overlay.icon_state = center_image(extra2_accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
if(!forced_colour)
|
||||
switch(S.extra_color_src) //change the color of the extra overlay
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
extra2_accessory_overlay.color = "#[fixed_mut_color]"
|
||||
else
|
||||
extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
if(MUTCOLORS2)
|
||||
if(fixed_mut_color2)
|
||||
extra2_accessory_overlay.color = "#[fixed_mut_color2]"
|
||||
else
|
||||
extra2_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
|
||||
if(MUTCOLORS3)
|
||||
if(fixed_mut_color3)
|
||||
extra2_accessory_overlay.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
extra2_accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
|
||||
if(HAIR)
|
||||
if(hair_color == "mutcolor")
|
||||
extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
else
|
||||
extra2_accessory_overlay.color = "#[H.hair_color]"
|
||||
if(FACEHAIR)
|
||||
extra2_accessory_overlay.color = "#[H.facial_hair_color]"
|
||||
if(EYECOLOR)
|
||||
extra2_accessory_overlay.color = "#[H.eye_color]"
|
||||
else
|
||||
extra2_accessory_overlay.color = forced_colour
|
||||
standing += extra2_accessory_overlay
|
||||
I = center_image(I,S.dimension_x,S.dimension_y)
|
||||
|
||||
switch(S.extra2_color_src) //change the color of the extra overlay
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
I.color = "#[fixed_mut_color]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor"]]"
|
||||
if(MUTCOLORS2)
|
||||
if(fixed_mut_color2)
|
||||
I.color = "#[fixed_mut_color2]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor2"]]"
|
||||
if(MUTCOLORS3)
|
||||
if(fixed_mut_color3)
|
||||
I.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor3"]]"
|
||||
if(HAIR)
|
||||
if(hair_color == "mutcolor")
|
||||
I.color = "#[H.dna.features["mcolor"]]"
|
||||
else
|
||||
I.color = "#[H.hair_color]"
|
||||
standing += I
|
||||
|
||||
H.overlays_standing[layer] = standing.Copy()
|
||||
standing = list()
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
med_hud_set_status()
|
||||
|
||||
/mob/living/Destroy()
|
||||
if(LAZYLEN(status_effects))
|
||||
for(var/s in status_effects)
|
||||
var/datum/status_effect/S = s
|
||||
if(S.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
|
||||
qdel(S)
|
||||
else
|
||||
S.be_replaced()
|
||||
if(ranged_ability)
|
||||
ranged_ability.remove_ranged_ability(src)
|
||||
if(buckled)
|
||||
|
||||
@@ -423,18 +423,17 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return 3
|
||||
return 0
|
||||
|
||||
/mob/living/say_quote(input, list/spans, message_mode)
|
||||
var/tempinput = attach_spans(input, spans)
|
||||
/mob/living/say_mod(input, message_mode)
|
||||
if(message_mode == MODE_WHISPER)
|
||||
return "[verb_whisper], \"[tempinput]\""
|
||||
if(message_mode == MODE_WHISPER_CRIT)
|
||||
return "[verb_whisper] in [p_their()] last breath, \"[tempinput]\""
|
||||
if (stuttering)
|
||||
return "stammers, \"[tempinput]\""
|
||||
if (getBrainLoss() >= 60)
|
||||
return "gibbers, \"[tempinput]\""
|
||||
|
||||
return ..()
|
||||
. = verb_whisper
|
||||
else if(message_mode == MODE_WHISPER_CRIT)
|
||||
. = "[verb_whisper] in [p_their()] last breath"
|
||||
else if(stuttering)
|
||||
. = "stammers"
|
||||
else if(getBrainLoss() >= 60)
|
||||
. = "gibbers"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/get_default_language()
|
||||
if(selected_default_language)
|
||||
@@ -448,5 +447,5 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
/mob/living/proc/open_language_menu(mob/user)
|
||||
language_menu.ui_interact(user)
|
||||
|
||||
/mob/living/whisper(message as text)
|
||||
say("#[message]")
|
||||
/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
|
||||
say("#[message]", bubble_type, spans, sanitize, language)
|
||||
|
||||
@@ -238,7 +238,7 @@
|
||||
else if(icontype == "Angel")
|
||||
icon_state = "ai-angel"
|
||||
//else
|
||||
//usr <<"You can only change your display once!"
|
||||
//to_chat(usr, "You can only change your display once!")
|
||||
//return
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
@@ -351,7 +351,7 @@
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/AI = src
|
||||
if(AI.control_disabled)
|
||||
src << "Wireless control is disabled!"
|
||||
to_chat(src, "Wireless control is disabled!")
|
||||
return
|
||||
SSshuttle.cancelEvac(src)
|
||||
return
|
||||
|
||||
@@ -271,6 +271,7 @@
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/borg/cyborghug/medical,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
/obj/item/weapon/organ_storage,
|
||||
/obj/item/borg/lollipop)
|
||||
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked)
|
||||
ratvar_modules = list(
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/datum/mind/origin
|
||||
var/egg_lain = 0
|
||||
gold_core_spawnable = 1 //are you sure about this??
|
||||
// gold_core_spawnable = 1 //are you sure about this??
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
|
||||
|
||||
@@ -46,7 +46,7 @@ Difficulty: Very Hard
|
||||
del_on_death = 1
|
||||
medal_type = MEDAL_PREFIX
|
||||
score_type = COLOSSUS_SCORE
|
||||
loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/vocal_cords/colossus)
|
||||
loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus)
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
|
||||
deathmessage = "disintegrates, leaving a glowing core in its wake."
|
||||
death_sound = 'sound/magic/demon_dies.ogg'
|
||||
@@ -360,9 +360,20 @@ Difficulty: Very Hard
|
||||
|
||||
///Anomolous Crystal///
|
||||
|
||||
#define ACTIVATE_TOUCH "touch"
|
||||
#define ACTIVATE_SPEECH "speech"
|
||||
#define ACTIVATE_HEAT "heat"
|
||||
#define ACTIVATE_BULLET "bullet"
|
||||
#define ACTIVATE_ENERGY "energy"
|
||||
#define ACTIVATE_BOMB "bomb"
|
||||
#define ACTIVATE_MOB_BUMP "bumping"
|
||||
#define ACTIVATE_WEAPON "weapon"
|
||||
#define ACTIVATE_MAGIC "magic"
|
||||
|
||||
/obj/machinery/anomalous_crystal
|
||||
name = "anomalous crystal"
|
||||
desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread."
|
||||
var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "anomaly_crystal"
|
||||
light_range = 8
|
||||
@@ -370,66 +381,78 @@ Difficulty: Very Hard
|
||||
use_power = 0
|
||||
density = 1
|
||||
flags = HEAR
|
||||
var/activation_method = "touch"
|
||||
var/activation_method
|
||||
var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC)
|
||||
|
||||
var/activation_damage_type = null
|
||||
var/last_use_timer = 0
|
||||
var/cooldown_add = 30
|
||||
var/list/affected_targets = list()
|
||||
var/activation_sound = 'sound/effects/break_stone.ogg'
|
||||
|
||||
/obj/machinery/anomalous_crystal/New()
|
||||
activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","heat","weapon","speech")
|
||||
..()
|
||||
/obj/machinery/anomalous_crystal/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!activation_method)
|
||||
activation_method = pick(possible_methods)
|
||||
|
||||
/obj/machinery/anomalous_crystal/examine(mob/user)
|
||||
. = ..()
|
||||
if(isobserver(user))
|
||||
to_chat(user, observer_desc)
|
||||
to_chat(user, "It is activated by [activation_method].")
|
||||
|
||||
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
|
||||
..()
|
||||
if(isliving(speaker))
|
||||
ActivationReaction(speaker,"speech")
|
||||
ActivationReaction(speaker, ACTIVATE_SPEECH)
|
||||
|
||||
/obj/machinery/anomalous_crystal/attack_hand(mob/user)
|
||||
..()
|
||||
ActivationReaction(user,"touch")
|
||||
ActivationReaction(user, ACTIVATE_TOUCH)
|
||||
|
||||
/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params)
|
||||
if(I.is_hot())
|
||||
ActivationReaction(user,"heat")
|
||||
ActivationReaction(user, ACTIVATE_HEAT)
|
||||
else
|
||||
ActivationReaction(user,"weapon")
|
||||
ActivationReaction(user, ACTIVATE_WEAPON)
|
||||
..()
|
||||
|
||||
/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
|
||||
..()
|
||||
if(istype(P, /obj/item/projectile/magic))
|
||||
ActivationReaction(P.firer, "magic", P.damage_type)
|
||||
ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type)
|
||||
return
|
||||
ActivationReaction(P.firer, P.flag, P.damage_type)
|
||||
|
||||
/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype)
|
||||
if(world.time < last_use_timer)
|
||||
return 0
|
||||
return FALSE
|
||||
if(activation_damage_type && activation_damage_type != damtype)
|
||||
return 0
|
||||
return FALSE
|
||||
if(method != activation_method)
|
||||
return 0
|
||||
return FALSE
|
||||
last_use_timer = (world.time + cooldown_add)
|
||||
playsound(user, activation_sound, 100, 1)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj)
|
||||
..()
|
||||
if(ismob(AM))
|
||||
ActivationReaction(AM,"mob_bump")
|
||||
ActivationReaction(AM, ACTIVATE_MOB_BUMP)
|
||||
|
||||
/obj/machinery/anomalous_crystal/ex_act()
|
||||
ActivationReaction(null,"bomb")
|
||||
ActivationReaction(null, ACTIVATE_BOMB)
|
||||
|
||||
/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot
|
||||
var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal)
|
||||
new random_crystal(loc)
|
||||
qdel(src)
|
||||
/obj/effect/spawner/lootdrop/anomalous_crystal
|
||||
name = "anomalous crystal spawner"
|
||||
|
||||
/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize()
|
||||
loot = subtypesof(/obj/machinery/anomalous_crystal)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
|
||||
activation_method = "mob_bump"
|
||||
observer_desc = "This crystal strips and equips its targets as clowns."
|
||||
possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH)
|
||||
activation_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user)
|
||||
@@ -442,12 +465,9 @@ Difficulty: Very Hard
|
||||
qdel(C)
|
||||
affected_targets.Add(H)
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk/New()
|
||||
..()
|
||||
activation_method = pick("mob_bump","speech")
|
||||
|
||||
/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one
|
||||
activation_method = "touch"
|
||||
observer_desc = "This crystal warps the area around it to a theme."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
cooldown_add = 200
|
||||
var/terrain_theme = "winter"
|
||||
var/NewTerrainFloors
|
||||
@@ -457,9 +477,11 @@ Difficulty: Very Hard
|
||||
var/list/NewFlora = list()
|
||||
var/florachance = 8
|
||||
|
||||
/obj/machinery/anomalous_crystal/theme_warp/New()
|
||||
..()
|
||||
/obj/machinery/anomalous_crystal/theme_warp/Initialize()
|
||||
. = ..()
|
||||
terrain_theme = pick("lavaland","winter","jungle","ayy lmao")
|
||||
observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"."
|
||||
|
||||
switch(terrain_theme)
|
||||
if("lavaland")//Depressurizes the place... and free cult metal, I guess.
|
||||
NewTerrainFloors = /turf/open/floor/grass/snow/basalt
|
||||
@@ -518,15 +540,19 @@ Difficulty: Very Hard
|
||||
affected_targets += A
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
|
||||
activation_method = "touch"
|
||||
observer_desc = "This crystal generates a projectile when activated."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
cooldown_add = 50
|
||||
var/generated_projectile = /obj/item/projectile/beam/emitter
|
||||
var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter/New()
|
||||
..()
|
||||
/obj/machinery/anomalous_crystal/emitter/Initialize()
|
||||
. = ..()
|
||||
generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade,
|
||||
/obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
|
||||
|
||||
var/proj_name = initial(generated_projectile.name)
|
||||
observer_desc = "This crystal generates \a [proj_name] when activated."
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
|
||||
if(..())
|
||||
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
|
||||
@@ -547,7 +573,8 @@ Difficulty: Very Hard
|
||||
P.fire()
|
||||
|
||||
/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down.
|
||||
activation_method = "touch"
|
||||
observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
activation_sound = 'sound/hallucinations/growl1.ogg'
|
||||
|
||||
/obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method)
|
||||
@@ -565,13 +592,20 @@ Difficulty: Very Hard
|
||||
H.grab_ghost(force = TRUE)
|
||||
|
||||
/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
|
||||
activation_method = "touch"
|
||||
var/ready_to_deploy = 0
|
||||
observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
activation_sound = 'sound/effects/ghost2.ogg'
|
||||
var/ready_to_deploy = FALSE
|
||||
|
||||
/obj/machinery/anomalous_crystal/helpers/Destroy()
|
||||
GLOB.poi_list -= src
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
|
||||
if(..() && !ready_to_deploy)
|
||||
ready_to_deploy = 1
|
||||
notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "<a href=?src=\ref[src];ghostjoin=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK)
|
||||
GLOB.poi_list |= src
|
||||
ready_to_deploy = TRUE
|
||||
notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "<a href=?src=\ref[src];ghostjoin=1>(Click to enter)</a>", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK)
|
||||
|
||||
/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user)
|
||||
..()
|
||||
@@ -613,10 +647,12 @@ Difficulty: Very Hard
|
||||
verb_ask = "floats inquisitively"
|
||||
verb_exclaim = "zaps"
|
||||
verb_yell = "bangs"
|
||||
initial_languages = list(/datum/language/common, /datum/language/slime)
|
||||
only_speaks_language = /datum/language/slime
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
light_range = 4
|
||||
faction = list("neutral")
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
unsuitable_atmos_damage = 0
|
||||
movement_type = FLYING
|
||||
minbodytemp = 0
|
||||
@@ -638,7 +674,7 @@ Difficulty: Very Hard
|
||||
. = ..()
|
||||
if(isliving(target) && target != src)
|
||||
var/mob/living/L = target
|
||||
if(L.stat < DEAD)
|
||||
if(L.stat != DEAD)
|
||||
L.heal_overall_damage(heal_power, heal_power)
|
||||
new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
|
||||
|
||||
@@ -649,13 +685,14 @@ Difficulty: Very Hard
|
||||
|
||||
|
||||
/obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it.
|
||||
activation_method = "touch"
|
||||
observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
cooldown_add = 50
|
||||
activation_sound = 'sound/magic/TIMEPARADOX2.ogg'
|
||||
var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook)
|
||||
|
||||
/obj/machinery/anomalous_crystal/refresher/New()
|
||||
..()
|
||||
/obj/machinery/anomalous_crystal/refresher/Initialize()
|
||||
. = ..()
|
||||
banned_items_typecache = typecacheof(banned_items_typecache)
|
||||
|
||||
|
||||
@@ -675,7 +712,8 @@ Difficulty: Very Hard
|
||||
qdel(CHOSEN)
|
||||
|
||||
/obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU.
|
||||
activation_method = "touch"
|
||||
observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well."
|
||||
activation_method = ACTIVATE_TOUCH
|
||||
|
||||
/obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method)
|
||||
if(..())
|
||||
@@ -770,4 +808,14 @@ Difficulty: Very Hard
|
||||
target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
|
||||
|
||||
|
||||
#undef ACTIVATE_TOUCH
|
||||
#undef ACTIVATE_SPEECH
|
||||
#undef ACTIVATE_HEAT
|
||||
#undef ACTIVATE_BULLET
|
||||
#undef ACTIVATE_ENERGY
|
||||
#undef ACTIVATE_BOMB
|
||||
#undef ACTIVATE_MOB_BUMP
|
||||
#undef ACTIVATE_WEAPON
|
||||
#undef ACTIVATE_MAGIC
|
||||
|
||||
#undef MEDAL_PREFIX
|
||||
|
||||
@@ -127,9 +127,11 @@
|
||||
stuttering = 0
|
||||
|
||||
/mob/living/simple_animal/proc/handle_automated_action()
|
||||
set waitfor = FALSE
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/proc/handle_automated_movement()
|
||||
set waitfor = FALSE
|
||||
if(!stop_automated_movement && wander)
|
||||
if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
turns_since_move++
|
||||
@@ -142,6 +144,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/proc/handle_automated_speech(var/override)
|
||||
set waitfor = FALSE
|
||||
if(speak_chance)
|
||||
if(prob(speak_chance) || override)
|
||||
if(speak && speak.len)
|
||||
@@ -251,10 +254,10 @@
|
||||
if(icon_gib)
|
||||
new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
|
||||
|
||||
/mob/living/simple_animal/say_quote(input, list/spans)
|
||||
/mob/living/simple_animal/say_mod(input, message_mode)
|
||||
if(speak_emote && speak_emote.len)
|
||||
verb_say = pick(speak_emote)
|
||||
return ..()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/emote(act, m_type=1, message = null)
|
||||
if(stat)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
GLOB.dead_mob_list -= src
|
||||
GLOB.living_mob_list -= src
|
||||
GLOB.all_clockwork_mobs -= src
|
||||
GLOB.mob_directory -= tag
|
||||
if(observers && observers.len)
|
||||
for(var/M in observers)
|
||||
var/mob/dead/observe = M
|
||||
@@ -22,6 +23,7 @@
|
||||
/mob/Initialize()
|
||||
tag = "mob_[next_mob_id++]"
|
||||
GLOB.mob_list += src
|
||||
GLOB.mob_directory[tag] = src
|
||||
if(stat == DEAD)
|
||||
GLOB.dead_mob_list += src
|
||||
else
|
||||
|
||||
@@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
A.action = action
|
||||
A.target = source
|
||||
if(!alert_overlay)
|
||||
alert_overlay = new(src)
|
||||
alert_overlay = new(source)
|
||||
alert_overlay.layer = FLOAT_LAYER
|
||||
alert_overlay.plane = FLOAT_PLANE
|
||||
A.add_overlay(alert_overlay)
|
||||
|
||||
@@ -13,12 +13,6 @@
|
||||
stored_implants += IMP
|
||||
IMP.removed(src, 1, 1)
|
||||
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
var/list/missing_bodyparts_zones = get_missing_limbs()
|
||||
|
||||
var/obj/item/cavity_object
|
||||
@@ -92,10 +86,21 @@
|
||||
var/obj/item/weapon/implant/IMP = Y
|
||||
IMP.implant(O, null, 1)
|
||||
|
||||
//re-add organs to new mob
|
||||
//re-add organs to new mob. this order prevents moving the mind to a brain at any point
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in O.internal_organs)
|
||||
qdel(X)
|
||||
var/obj/item/organ/I = X
|
||||
I.Remove(O, 1)
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
|
||||
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
for(var/X in int_organs)
|
||||
var/obj/item/organ/I = X
|
||||
@@ -118,7 +123,7 @@
|
||||
qdel(G) //we lose the organs in the missing limbs
|
||||
qdel(BP)
|
||||
|
||||
//transfer mind and delete old mob
|
||||
//transfer mind if we didn't yet
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
@@ -154,12 +159,6 @@
|
||||
stored_implants += IMP
|
||||
IMP.removed(src, 1, 1)
|
||||
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
var/list/missing_bodyparts_zones = get_missing_limbs()
|
||||
|
||||
var/obj/item/cavity_object
|
||||
@@ -244,7 +243,19 @@
|
||||
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in O.internal_organs)
|
||||
qdel(X)
|
||||
var/obj/item/organ/I = X
|
||||
I.Remove(O, 1)
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers)
|
||||
mind.changeling.purchasedpowers -= HF
|
||||
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
for(var/X in int_organs)
|
||||
var/obj/item/organ/I = X
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
filedesc = "ID card modification program"
|
||||
program_icon_state = "id"
|
||||
extended_desc = "Program for programming employee ID cards to access parts of the station."
|
||||
transfer_access = GLOB.access_change_ids
|
||||
transfer_access = GLOB.access_heads
|
||||
requires_ntnet = 0
|
||||
size = 8
|
||||
var/mod_mode = 1
|
||||
@@ -452,7 +452,7 @@
|
||||
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
|
||||
if(auth_card)
|
||||
region_access = list()
|
||||
if(transfer_access in auth_card.GetAccess())
|
||||
if(GLOB.access_change_ids in auth_card.GetAccess())
|
||||
minor = 0
|
||||
authenticated = 1
|
||||
return 1
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
connect_to_network()
|
||||
|
||||
sparks = new
|
||||
sparks.attach(src)
|
||||
sparks.set_up(5, TRUE, src)
|
||||
|
||||
/obj/machinery/power/emitter/Destroy()
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
narsie_spawn_animation()
|
||||
|
||||
sleep(70)
|
||||
SSshuttle.emergency.request(null, 0.1) // Cannot recall
|
||||
SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall
|
||||
|
||||
|
||||
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
|
||||
|
||||
@@ -135,27 +135,27 @@
|
||||
|
||||
/// SAW ROUNDS
|
||||
|
||||
/obj/item/ammo_casing/mm556x45
|
||||
desc = "A 556x45mm bullet casing."
|
||||
/obj/item/ammo_casing/mm195x129
|
||||
desc = "A 1.95x129mm bullet casing."
|
||||
icon_state = "762-casing"
|
||||
caliber = "mm55645"
|
||||
caliber = "mm195129"
|
||||
projectile_type = /obj/item/projectile/bullet/saw
|
||||
|
||||
/obj/item/ammo_casing/mm556x45/bleeding
|
||||
desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
|
||||
/obj/item/ammo_casing/mm195x129/bleeding
|
||||
desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
|
||||
icon_state = "762-casing"
|
||||
projectile_type = /obj/item/projectile/bullet/saw/bleeding
|
||||
|
||||
/obj/item/ammo_casing/mm556x45/hollow
|
||||
desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets."
|
||||
/obj/item/ammo_casing/mm195x129/hollow
|
||||
desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/saw/hollow
|
||||
|
||||
/obj/item/ammo_casing/mm556x45/ap
|
||||
desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
|
||||
/obj/item/ammo_casing/mm195x129/ap
|
||||
desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/saw/ap
|
||||
|
||||
/obj/item/ammo_casing/mm556x45/incen
|
||||
desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
|
||||
/obj/item/ammo_casing/mm195x129/incen
|
||||
desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
|
||||
projectile_type = /obj/item/projectile/bullet/saw/incen
|
||||
|
||||
|
||||
|
||||
@@ -234,35 +234,35 @@
|
||||
|
||||
//// SAW MAGAZINES
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45
|
||||
name = "box magazine (5.56x45mm)"
|
||||
/obj/item/ammo_box/magazine/mm195x129
|
||||
name = "box magazine (1.95x129mm)"
|
||||
icon_state = "a762-50"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = /obj/item/ammo_casing/mm556x45
|
||||
caliber = "mm55645"
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129
|
||||
caliber = "mm195129"
|
||||
max_ammo = 50
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45/bleeding
|
||||
name = "box magazine (Bleeding 5.56x45mm)"
|
||||
/obj/item/ammo_box/magazine/mm195x129/bleeding
|
||||
name = "box magazine (Bleeding 1.95x129mm)"
|
||||
origin_tech = "combat=3"
|
||||
ammo_type = /obj/item/ammo_casing/mm556x45/bleeding
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/bleeding
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45/hollow
|
||||
name = "box magazine (Hollow-Point 5.56x45mm)"
|
||||
/obj/item/ammo_box/magazine/mm195x129/hollow
|
||||
name = "box magazine (Hollow-Point 1.95x129mm)"
|
||||
origin_tech = "combat=3"
|
||||
ammo_type = /obj/item/ammo_casing/mm556x45/hollow
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/hollow
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45/ap
|
||||
name = "box magazine (Armor Penetrating 5.56x45mm)"
|
||||
/obj/item/ammo_box/magazine/mm195x129/ap
|
||||
name = "box magazine (Armor Penetrating 1.95x129mm)"
|
||||
origin_tech = "combat=4"
|
||||
ammo_type = /obj/item/ammo_casing/mm556x45/ap
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/ap
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45/incen
|
||||
name = "box magazine (Incendiary 5.56x45mm)"
|
||||
/obj/item/ammo_box/magazine/mm195x129/incen
|
||||
name = "box magazine (Incendiary 1.95x129mm)"
|
||||
origin_tech = "combat=4"
|
||||
ammo_type = /obj/item/ammo_casing/mm556x45/incen
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/incen
|
||||
|
||||
/obj/item/ammo_box/magazine/mm556x45/update_icon()
|
||||
/obj/item/ammo_box/magazine/mm195x129/update_icon()
|
||||
..()
|
||||
icon_state = "a762-[round(ammo_count(),10)]"
|
||||
|
||||
|
||||
@@ -278,13 +278,13 @@
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/l6_saw
|
||||
name = "\improper L6 SAW"
|
||||
desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
icon_state = "l6closed100"
|
||||
item_state = "l6closedmag"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
slot_flags = 0
|
||||
origin_tech = "combat=6;engineering=3;syndicate=6"
|
||||
mag_type = /obj/item/ammo_box/magazine/mm556x45
|
||||
mag_type = /obj/item/ammo_box/magazine/mm195x129
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
var/cover_open = 0
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user)
|
||||
..()
|
||||
if(power_supply)
|
||||
user <<"<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>"
|
||||
to_chat(user, "<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>")
|
||||
|
||||
/obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
|
||||
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
|
||||
|
||||
@@ -54,7 +54,9 @@
|
||||
/obj/item/slime_extract = list(),
|
||||
/obj/item/weapon/reagent_containers/pill = list(),
|
||||
/obj/item/weapon/reagent_containers/food = list(),
|
||||
/obj/item/weapon/reagent_containers/honeycomb = list()
|
||||
/obj/item/weapon/reagent_containers/honeycomb = list(),
|
||||
/obj/item/toy/crayon = list()
|
||||
|
||||
)
|
||||
|
||||
var/list/juice_items = list (
|
||||
@@ -455,3 +457,13 @@
|
||||
O.reagents.trans_to(beaker, amount)
|
||||
if(!O.reagents.total_volume)
|
||||
remove_object(O)
|
||||
|
||||
for (var/obj/item/toy/crayon/O in holdingitems)
|
||||
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
||||
break
|
||||
for (var/r_id in O.reagent_contents)
|
||||
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
|
||||
if (space == 0)
|
||||
break
|
||||
beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space))
|
||||
remove_object(O)
|
||||
|
||||
@@ -1128,7 +1128,7 @@
|
||||
//For colouring in /proc/mix_color_from_reagents
|
||||
|
||||
|
||||
/datum/reagent/crayonpowder
|
||||
/datum/reagent/colorful_reagent/crayonpowder
|
||||
name = "Crayon Powder"
|
||||
id = "crayon powder"
|
||||
var/colorname = "none"
|
||||
@@ -1137,50 +1137,72 @@
|
||||
color = "#FFFFFF" // rgb: 207, 54, 0
|
||||
taste_description = "the back of class"
|
||||
|
||||
/datum/reagent/crayonpowder/New()
|
||||
/datum/reagent/colorful_reagent/crayonpowder/New()
|
||||
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
|
||||
|
||||
|
||||
/datum/reagent/crayonpowder/red
|
||||
/datum/reagent/colorful_reagent/crayonpowder/red
|
||||
name = "Red Crayon Powder"
|
||||
id = "redcrayonpowder"
|
||||
colorname = "red"
|
||||
color = "#DA0000" // red
|
||||
random_color_list = list("#DA0000")
|
||||
|
||||
/datum/reagent/crayonpowder/orange
|
||||
/datum/reagent/colorful_reagent/crayonpowder/orange
|
||||
name = "Orange Crayon Powder"
|
||||
id = "orangecrayonpowder"
|
||||
colorname = "orange"
|
||||
color = "#FF9300" // orange
|
||||
random_color_list = list("#FF9300")
|
||||
|
||||
/datum/reagent/crayonpowder/yellow
|
||||
/datum/reagent/colorful_reagent/crayonpowder/yellow
|
||||
name = "Yellow Crayon Powder"
|
||||
id = "yellowcrayonpowder"
|
||||
colorname = "yellow"
|
||||
color = "#FFF200" // yellow
|
||||
random_color_list = list("#FFF200")
|
||||
|
||||
/datum/reagent/crayonpowder/green
|
||||
/datum/reagent/colorful_reagent/crayonpowder/green
|
||||
name = "Green Crayon Powder"
|
||||
id = "greencrayonpowder"
|
||||
colorname = "green"
|
||||
color = "#A8E61D" // green
|
||||
random_color_list = list("#A8E61D")
|
||||
|
||||
/datum/reagent/crayonpowder/blue
|
||||
/datum/reagent/colorful_reagent/crayonpowder/blue
|
||||
name = "Blue Crayon Powder"
|
||||
id = "bluecrayonpowder"
|
||||
colorname = "blue"
|
||||
color = "#00B7EF" // blue
|
||||
random_color_list = list("#00B7EF")
|
||||
|
||||
/datum/reagent/crayonpowder/purple
|
||||
/datum/reagent/colorful_reagent/crayonpowder/purple
|
||||
name = "Purple Crayon Powder"
|
||||
id = "purplecrayonpowder"
|
||||
colorname = "purple"
|
||||
color = "#DA00FF" // purple
|
||||
random_color_list = list("#DA00FF")
|
||||
|
||||
/datum/reagent/crayonpowder/invisible
|
||||
/datum/reagent/colorful_reagent/crayonpowder/invisible
|
||||
name = "Invisible Crayon Powder"
|
||||
id = "invisiblecrayonpowder"
|
||||
colorname = "invisible"
|
||||
color = "#FFFFFF00" // white + no alpha
|
||||
random_color_list = list(null) //because using the powder color turns things invisible
|
||||
|
||||
/datum/reagent/colorful_reagent/crayonpowder/black
|
||||
name = "Black Crayon Powder"
|
||||
id = "blackcrayonpowder"
|
||||
colorname = "black"
|
||||
color = "#1C1C1C" // not quite black
|
||||
random_color_list = list("#404040")
|
||||
|
||||
/datum/reagent/colorful_reagent/crayonpowder/white
|
||||
name = "White Crayon Powder"
|
||||
id = "whitecrayonpowder"
|
||||
colorname = "white"
|
||||
color = "#FFFFFF" // white
|
||||
random_color_list = list("#FFFFFF") //doesn't actually change appearance at all
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -25,13 +25,10 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/proc/update_pack_name()
|
||||
if(!labelled)
|
||||
if(volume)
|
||||
if(blood_type)
|
||||
name = "blood pack [blood_type]"
|
||||
else
|
||||
name = "blood pack"
|
||||
if(blood_type)
|
||||
name = "blood pack - [blood_type]"
|
||||
else
|
||||
name = "empty blood pack"
|
||||
name = "blood pack"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/update_icon()
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
@@ -69,7 +66,7 @@
|
||||
blood_type = "L"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/empty
|
||||
name = "empty blood pack"
|
||||
name = "blood pack"
|
||||
icon_state = "empty"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
|
||||
|
||||
@@ -279,3 +279,27 @@
|
||||
slot_equipment_priority.Insert(index, slot_head)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/beaker/waterbottle
|
||||
name = "bottle of water"
|
||||
desc = "A bottle of water filled at an old Earth bottling facility,"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "smallbottle"
|
||||
item_state = "bottle"
|
||||
list_reagents = list("water" = 49.5, "fluorine" = 0.5)//see desc, don't think about it too hard
|
||||
materials = list(MAT_GLASS=0)
|
||||
volume = 50
|
||||
amount_per_transfer_from_this = 10
|
||||
origin_tech = null
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large
|
||||
desc = "A fresh commercial-sized bottle of water."
|
||||
icon_state = "largebottle"
|
||||
materials = list(MAT_GLASS=0)
|
||||
list_reagents = list("water" = 100)
|
||||
volume = 100
|
||||
amount_per_transfer_from_this = 20
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -212,13 +212,14 @@
|
||||
|
||||
|
||||
/obj/machinery/conveyor_switch/Initialize(mapload, newid)
|
||||
if(mapload)
|
||||
return TRUE //need machines list
|
||||
. = ..()
|
||||
..()
|
||||
if(!id)
|
||||
id = newid
|
||||
update()
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD //for machines list
|
||||
|
||||
/obj/machinery/conveyor_switch/LateInitialize()
|
||||
conveyors = list()
|
||||
for(var/obj/machinery/conveyor/C in GLOB.machines)
|
||||
if(C.id == id)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
diff a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm (rejected hunks)
|
||||
@@ -220,7 +220,7 @@
|
||||
id = newid
|
||||
update()
|
||||
|
||||
- return INITIALIZE_HINT_LATELOAD
|
||||
+ return INITIALIZE_HINT_LATELOAD //for machines list
|
||||
|
||||
/obj/machinery/conveyor_switch/LateInitialize()
|
||||
conveyors = list()
|
||||
@@ -63,17 +63,17 @@
|
||||
deconstruct()
|
||||
|
||||
/obj/machinery/disposal/Initialize(mapload)
|
||||
. = mapload //late-initialize, we need turfs to have air
|
||||
if(initialized) //will only be run on late mapload initialization
|
||||
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
|
||||
var/atom/L = loc
|
||||
var/datum/gas_mixture/env = new
|
||||
env.copy_from(L.return_air())
|
||||
var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1)
|
||||
air_contents.merge(removed)
|
||||
trunk_check()
|
||||
else
|
||||
..()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
|
||||
|
||||
/obj/machinery/disposal/LateInitialize()
|
||||
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
|
||||
var/atom/L = loc
|
||||
var/datum/gas_mixture/env = new
|
||||
env.copy_from(L.return_air())
|
||||
var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1)
|
||||
air_contents.merge(removed)
|
||||
trunk_check()
|
||||
|
||||
/obj/machinery/disposal/attackby(obj/item/I, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
///////SMELTABLE ALLOYS///////
|
||||
|
||||
/datum/design/plasteel_alloy
|
||||
name = "Plasma + Iron alloy"
|
||||
id = "plasteel"
|
||||
build_type = SMELTER
|
||||
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
|
||||
build_path = /obj/item/stack/sheet/plasteel
|
||||
category = list("initial","Alloys")
|
||||
|
||||
|
||||
/datum/design/plastitanium_alloy
|
||||
name = "Plasma + Titanium alloy"
|
||||
id = "plastitanium"
|
||||
build_type = SMELTER
|
||||
materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
|
||||
build_path = /obj/item/stack/sheet/mineral/plastitanium
|
||||
category = list("initial","Alloys")
|
||||
@@ -1068,7 +1068,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
/obj/machinery/computer/rdconsole/robotics/Initialize()
|
||||
. = ..()
|
||||
if(circuit)
|
||||
circuit.name = "RD Console - Robotics (Computer Board)"
|
||||
circuit.name = "R&D Console - Robotics (Computer Board)"
|
||||
circuit.build_path = /obj/machinery/computer/rdconsole/robotics
|
||||
|
||||
/obj/machinery/computer/rdconsole/core
|
||||
|
||||
@@ -175,6 +175,21 @@ research holder datum.
|
||||
return
|
||||
..()
|
||||
|
||||
//Smelter files
|
||||
/datum/research/smelter/New()
|
||||
for(var/T in (subtypesof(/datum/tech)))
|
||||
possible_tech += new T(src)
|
||||
for(var/path in subtypesof(/datum/design))
|
||||
var/datum/design/D = new path(src)
|
||||
possible_designs += D
|
||||
if((D.build_type & SMELTER) && ("initial" in D.category))
|
||||
AddDesign2Known(D)
|
||||
|
||||
/datum/research/biogenerator/AddDesign2Known(datum/design/D)
|
||||
if(!(D.build_type & SMELTER))
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/***************************************************************
|
||||
** Technology Datums **
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if(Uses >= 5)
|
||||
to_chat(user, "<span class='warning'>You cannot enhance this extract further!</span>")
|
||||
return ..()
|
||||
user <<"<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>"
|
||||
to_chat(user, "<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>")
|
||||
Uses++
|
||||
qdel(O)
|
||||
..()
|
||||
@@ -146,8 +146,8 @@
|
||||
|
||||
M.docile = 1
|
||||
M.nutrition = 700
|
||||
M <<"<span class='warning'>You absorb the potion and feel your intense desire to feed melt away.</span>"
|
||||
user <<"<span class='notice'>You feed the slime the potion, removing its hunger and calming it.</span>"
|
||||
to_chat(M, "<span class='warning'>You absorb the potion and feel your intense desire to feed melt away.</span>")
|
||||
to_chat(user, "<span class='notice'>You feed the slime the potion, removing its hunger and calming it.</span>")
|
||||
var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
|
||||
|
||||
if (!newname)
|
||||
@@ -261,10 +261,10 @@
|
||||
to_chat(user, "<span class='warning'>The slime is dead!</span>")
|
||||
return ..()
|
||||
if(M.cores >= 5)
|
||||
user <<"<span class='warning'>The slime already has the maximum amount of extract!</span>"
|
||||
to_chat(user, "<span class='warning'>The slime already has the maximum amount of extract!</span>")
|
||||
return ..()
|
||||
|
||||
user <<"<span class='notice'>You feed the slime the steroid. It will now produce one more extract.</span>"
|
||||
to_chat(user, "<span class='notice'>You feed the slime the steroid. It will now produce one more extract.</span>")
|
||||
M.cores++
|
||||
qdel(src)
|
||||
|
||||
@@ -288,10 +288,10 @@
|
||||
to_chat(user, "<span class='warning'>The slime is dead!</span>")
|
||||
return ..()
|
||||
if(M.mutation_chance == 0)
|
||||
user <<"<span class='warning'>The slime already has no chance of mutating!</span>"
|
||||
to_chat(user, "<span class='warning'>The slime already has no chance of mutating!</span>")
|
||||
return ..()
|
||||
|
||||
user <<"<span class='notice'>You feed the slime the stabilizer. It is now less likely to mutate.</span>"
|
||||
to_chat(user, "<span class='notice'>You feed the slime the stabilizer. It is now less likely to mutate.</span>")
|
||||
M.mutation_chance = Clamp(M.mutation_chance-15,0,100)
|
||||
qdel(src)
|
||||
|
||||
@@ -312,10 +312,10 @@
|
||||
to_chat(user, "<span class='warning'>This slime has already consumed a mutator, any more would be far too unstable!</span>")
|
||||
return ..()
|
||||
if(M.mutation_chance == 100)
|
||||
user <<"<span class='warning'>The slime is already guaranteed to mutate!</span>"
|
||||
to_chat(user, "<span class='warning'>The slime is already guaranteed to mutate!</span>")
|
||||
return ..()
|
||||
|
||||
user <<"<span class='notice'>You feed the slime the mutator. It is now more likely to mutate.</span>"
|
||||
to_chat(user, "<span class='notice'>You feed the slime the mutator. It is now more likely to mutate.</span>")
|
||||
M.mutation_chance = Clamp(M.mutation_chance+12,0,100)
|
||||
M.mutator_used = TRUE
|
||||
qdel(src)
|
||||
@@ -348,7 +348,7 @@
|
||||
return ..()
|
||||
R.vehicle_move_delay = 0
|
||||
|
||||
user <<"<span class='notice'>You slather the red gunk over the [C], making it faster.</span>"
|
||||
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it faster.</span>")
|
||||
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY)
|
||||
qdel(src)
|
||||
@@ -373,7 +373,7 @@
|
||||
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
|
||||
to_chat(user, "<span class='warning'>The [C] is already fireproof!</span>")
|
||||
return ..()
|
||||
user <<"<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>"
|
||||
to_chat(user, "<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>")
|
||||
C.name = "fireproofed [C.name]"
|
||||
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
@@ -144,5 +144,9 @@
|
||||
r_hand = /obj/item/weapon/melee/energy/sword/saber
|
||||
mask = /obj/item/clothing/mask/chameleon
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
flavour_text = "<font size=3>You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunatley, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause.</b> Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!</b>"
|
||||
flavour_text = "<font size=3>You are a syndicate agent, employed in a top secret research facility developing biological weapons. \n +\
|
||||
Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Monitor enemy activity as best you can, and try to keep a low profile. <u> Do not abandon the base, activate the self destruct device if you are compromised.</u></b> \n +\
|
||||
Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail.\n +\
|
||||
<u> Remember, an enemy of our enemy is a friend, so also provide support to those that hinder Nanotrasen unless commanded otherwise by HQ. \n +\
|
||||
Do not let the base fall into enemy hands!</u></font>"
|
||||
pocket2 = /obj/item/weapon/card/id/syndicate/anyone
|
||||
|
||||
@@ -22,20 +22,22 @@
|
||||
var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!!
|
||||
|
||||
/obj/docking_port/mobile/arrivals/Initialize(mapload)
|
||||
if(mapload)
|
||||
return TRUE //late initialize to make sure the latejoin list is populated
|
||||
|
||||
preferred_direction = dir
|
||||
|
||||
if(SSshuttle.arrivals)
|
||||
WARNING("More than one arrivals docking_port placed on map!")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
SSshuttle.arrivals = src
|
||||
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
preferred_direction = dir
|
||||
return INITIALIZE_HINT_LATELOAD //for latejoin list
|
||||
|
||||
|
||||
/obj/docking_port/mobile/arrivals/LateInitialize()
|
||||
areas = list()
|
||||
|
||||
var/list/new_latejoin = list()
|
||||
@@ -177,7 +179,7 @@
|
||||
|
||||
Launch(TRUE)
|
||||
|
||||
user << "<span class='notice'>Calling your shuttle. One moment...</span>"
|
||||
to_chat(user, "<span class='notice'>Calling your shuttle. One moment...</span>")
|
||||
while(mode != SHUTTLE_CALL && !damaged)
|
||||
stoplag()
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
diff a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm (rejected hunks)
|
||||
@@ -30,6 +30,9 @@
|
||||
..()
|
||||
|
||||
preferred_direction = dir
|
||||
+ return INITIALIZE_HINT_LATELOAD //for latejoin list
|
||||
+
|
||||
+/obj/docking_port/mobile/arrivals/LateInitialize()
|
||||
areas = list()
|
||||
|
||||
var/list/new_latejoin = list()
|
||||
@@ -207,8 +207,17 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert)
|
||||
var/call_time = SSshuttle.emergencyCallTime * coefficient
|
||||
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null)
|
||||
if(!isnum(set_coefficient))
|
||||
var/security_num = seclevel2num(get_security_level())
|
||||
switch(security_num)
|
||||
if(SEC_LEVEL_GREEN)
|
||||
set_coefficient = 2
|
||||
if(SEC_LEVEL_BLUE)
|
||||
set_coefficient = 1
|
||||
else
|
||||
set_coefficient = 0.5
|
||||
var/call_time = SSshuttle.emergencyCallTime * set_coefficient
|
||||
switch(mode)
|
||||
// The shuttle can not normally be called while "recalling", so
|
||||
// if this proc is called, it's via admin fiat
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
L+=T
|
||||
|
||||
if(!L.len)
|
||||
usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry."
|
||||
to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
|
||||
return
|
||||
|
||||
if(target && target.buckled)
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
if(M.mind)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>You feel raw magic flowing through you. It feels good!</span>"
|
||||
to_chat(M, "<span class='notice'>You feel raw magic flowing through you. It feels good!</span>")
|
||||
else
|
||||
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
|
||||
to_chat(M, "<span class='notice'>You feel very strange for a moment, but then it passes.</span>")
|
||||
burnt_out = 1
|
||||
charged_item = M
|
||||
break
|
||||
|
||||
@@ -42,6 +42,11 @@
|
||||
if(summon_lifespan)
|
||||
QDEL_IN(summoned_object, summon_lifespan)
|
||||
|
||||
post_summon(summoned_object, user)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/proc/post_summon(atom/summoned_object, mob/user)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/summonEdSwarm //test purposes - Also a lot of fun
|
||||
name = "Dispense Wizard Justice"
|
||||
desc = "This spell dispenses wizard justice."
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
else
|
||||
var/list/funky_turfs = RANGE_TURFS(1, user)
|
||||
for(var/turf/closed/solid in funky_turfs)
|
||||
user << "<span class='warning'>You're too close to a wall.</span>"
|
||||
to_chat(user, "<span class='warning'>You're too close to a wall.</span>")
|
||||
return
|
||||
dancefloor_exists = TRUE
|
||||
var/i = 1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Summon a number of traps to confuse and weaken your enemies, and possibly you."
|
||||
|
||||
charge_max = 250
|
||||
cooldown_min = 100
|
||||
cooldown_min = 50
|
||||
|
||||
clothes_req = 1
|
||||
invocation = "CAVERE INSIDIAS"
|
||||
@@ -14,10 +14,13 @@
|
||||
/obj/structure/trap/stun,
|
||||
/obj/structure/trap/fire,
|
||||
/obj/structure/trap/chill,
|
||||
/obj/structure/trap/damage,
|
||||
/obj/structure/swarmer/trap
|
||||
/obj/structure/trap/damage
|
||||
)
|
||||
summon_lifespan = 0
|
||||
summon_lifespan = 3000
|
||||
summon_amt = 5
|
||||
|
||||
action_icon_state = "the_traps"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/post_summon(obj/structure/trap/T, mob/user)
|
||||
T.immune_minds += user.mind
|
||||
T.charges = 1
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/datum/surgery_step/manipulate_organs
|
||||
time = 64
|
||||
name = "manipulate organs"
|
||||
implements = list(/obj/item/organ = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0)
|
||||
implements = list(/obj/item/organ = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0, /obj/item/weapon/organ_storage = 100)
|
||||
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
|
||||
var/implements_mend = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
|
||||
var/current_type
|
||||
@@ -55,6 +55,15 @@
|
||||
|
||||
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
I = null
|
||||
if(istype(tool, /obj/item/weapon/organ_storage))
|
||||
if(!tool.contents.len)
|
||||
to_chat(user, "<span class='notice'>There is nothing inside [tool]!</span>")
|
||||
return -1
|
||||
I = tool.contents[1]
|
||||
if(!isorgan(I))
|
||||
to_chat(user, "<span class='notice'>You cannot put [I] into [target]'s [parse_zone(target_zone)]!</span>")
|
||||
return -1
|
||||
tool = I
|
||||
if(isorgan(tool))
|
||||
current_type = "insert"
|
||||
I = tool
|
||||
@@ -74,7 +83,7 @@
|
||||
"<span class='notice'>You begin to extract [B] from [target]'s [parse_zone(target_zone)]...</span>")
|
||||
return TRUE
|
||||
if(!organs.len)
|
||||
to_chat(user, "<span class='notice'>There is no removeable organs in [target]'s [parse_zone(target_zone)]!</span>")
|
||||
to_chat(user, "<span class='notice'>There are no removeable organs in [target]'s [parse_zone(target_zone)]!</span>")
|
||||
return -1
|
||||
else
|
||||
for(var/obj/item/organ/O in organs)
|
||||
@@ -108,7 +117,14 @@
|
||||
target.heal_bodypart_damage(45,0)
|
||||
return 1
|
||||
else if(current_type == "insert")
|
||||
I = tool
|
||||
if(istype(tool, /obj/item/weapon/organ_storage))
|
||||
I = tool.contents[1]
|
||||
tool.icon_state = "evidenceobj"
|
||||
tool.desc = "A container for holding body parts."
|
||||
tool.cut_overlays()
|
||||
tool = I
|
||||
else
|
||||
I = tool
|
||||
user.drop_item()
|
||||
I.Insert(target)
|
||||
user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
if(C.disabilities & DEAF)
|
||||
deaf = max(deaf, 1)
|
||||
else
|
||||
if(HAS_SECONDARY_FLAG(C.ears, HEALS_EARS))
|
||||
if(C.ears && HAS_SECONDARY_FLAG(C.ears, HEALS_EARS))
|
||||
deaf = max(deaf - 1, 1)
|
||||
ear_damage = max(ear_damage - 0.10, 0)
|
||||
// if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs.
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
M.internal_organs -= src
|
||||
if(M.internal_organs_slot[slot] == src)
|
||||
M.internal_organs_slot.Remove(slot)
|
||||
if(vital && !special)
|
||||
if(vital && !special && !(M.status_flags & GODMODE))
|
||||
M.death()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
|
||||
var/static/regex/weaken_words = regex("drop|fall|trip|weaken")
|
||||
var/static/regex/sleep_words = regex("sleep|slumber")
|
||||
var/static/regex/sleep_words = regex("sleep|slumber|rest")
|
||||
var/static/regex/vomit_words = regex("vomit|throw up")
|
||||
var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
|
||||
var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
|
||||
@@ -206,7 +206,6 @@
|
||||
var/static/regex/throwmode_words = regex("throw|catch")
|
||||
var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
|
||||
var/static/regex/speak_words = regex("speak|say something")
|
||||
var/static/regex/rest_words = regex("rest")
|
||||
var/static/regex/getup_words = regex("get up")
|
||||
var/static/regex/sit_words = regex("sit")
|
||||
var/static/regex/stand_words = regex("stand")
|
||||
@@ -443,17 +442,9 @@
|
||||
L.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
|
||||
sleep(5) //So the chat flows more naturally
|
||||
|
||||
//REST
|
||||
else if((findtext(message, rest_words)))
|
||||
cooldown = COOLDOWN_MEME
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(!L.resting)
|
||||
L.lay_down()
|
||||
|
||||
//GET UP
|
||||
else if((findtext(message, getup_words)))
|
||||
cooldown = COOLDOWN_DAMAGE
|
||||
cooldown = COOLDOWN_DAMAGE //because stun removal
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.resting)
|
||||
|
||||
@@ -16,11 +16,20 @@
|
||||
|
||||
/datum/surgery_step/add_prosthetic
|
||||
name = "add prosthetic"
|
||||
implements = list(/obj/item/bodypart = 100, /obj/item/weapon/twohanded/required/chainsaw = 100, /obj/item/weapon/melee/synthetic_arm_blade = 100)
|
||||
implements = list(/obj/item/bodypart = 100, /obj/item/weapon/organ_storage = 100, /obj/item/weapon/twohanded/required/chainsaw = 100, /obj/item/weapon/melee/synthetic_arm_blade = 100)
|
||||
time = 32
|
||||
var/organ_rejection_dam = 0
|
||||
|
||||
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(tool, /obj/item/weapon/organ_storage))
|
||||
if(!tool.contents.len)
|
||||
to_chat(user, "<span class='notice'>There is nothing inside [tool]!</span>")
|
||||
return -1
|
||||
var/obj/item/I = tool.contents[1]
|
||||
if(!isbodypart(I))
|
||||
to_chat(user, "<span class='notice'>[I] cannot be attached!</span>")
|
||||
return -1
|
||||
tool = I
|
||||
if(istype(tool, /obj/item/bodypart))
|
||||
var/obj/item/bodypart/BP = tool
|
||||
if(ismonkey(target))// monkey patient only accept organic monkey limbs
|
||||
@@ -49,6 +58,11 @@
|
||||
return -1
|
||||
|
||||
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(tool, /obj/item/weapon/organ_storage))
|
||||
tool.icon_state = "evidenceobj"
|
||||
tool.desc = "A container for holding body parts."
|
||||
tool.cut_overlays()
|
||||
tool = tool.contents[1]
|
||||
if(istype(tool, /obj/item/bodypart))
|
||||
var/obj/item/bodypart/L = tool
|
||||
user.drop_item()
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
diff a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm (rejected hunks)
|
||||
@@ -54,7 +54,7 @@
|
||||
return new step_type
|
||||
|
||||
/datum/surgery/proc/complete()
|
||||
- feedback_add_details("surgeries_completed", type)
|
||||
+ feedback_add_details("surgeries_completed", "[type]")
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -97,4 +97,57 @@
|
||||
|
||||
/obj/item/weapon/surgical_drapes/attack(mob/living/M, mob/user)
|
||||
if(!attempt_initiate_surgery(src, M, user))
|
||||
..()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/organ_storage //allows medical cyborgs to manipulate organs without hands
|
||||
name = "organ storage bag"
|
||||
desc = "A container for holding body parts."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "evidenceobj"
|
||||
|
||||
/obj/item/weapon/organ_storage/afterattack(obj/item/I, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(contents.len)
|
||||
to_chat(user, "<span class='notice'>[src] already has something inside it.</span>")
|
||||
return
|
||||
if(isorgan(I))
|
||||
var/obj/item/organ/O = I
|
||||
if(O.status != ORGAN_ORGANIC)
|
||||
to_chat(user, "<span class='notice'>[src] can only hold organic body parts!</span>")
|
||||
return
|
||||
else if(isbodypart(I))
|
||||
var/obj/item/bodypart/BP = I
|
||||
if(BP.status != BODYPART_ORGANIC)
|
||||
to_chat(user, "<span class='notice'>[src] can only hold organic body parts!</span>")
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
user.visible_message("[user] puts [I] into [src].", "<span class='notice'>You put [I] inside [src].</span>")
|
||||
icon_state = "evidence"
|
||||
var/xx = I.pixel_x
|
||||
var/yy = I.pixel_y
|
||||
I.pixel_x = 0
|
||||
I.pixel_y = 0
|
||||
var/image/img = image("icon"=I, "layer"=FLOAT_LAYER)
|
||||
img.plane = FLOAT_PLANE
|
||||
I.pixel_x = xx
|
||||
I.pixel_y = yy
|
||||
add_overlay(img)
|
||||
add_overlay("evidence")
|
||||
desc = "An organ storage container holding [I]."
|
||||
I.loc = src
|
||||
w_class = I.w_class
|
||||
|
||||
/obj/item/weapon/organ_storage/attack_self(mob/user)
|
||||
if(contents.len)
|
||||
var/obj/item/I = contents[1]
|
||||
user.visible_message("[user] dumps [I] from [src].", "<span class='notice'>You dump [I] from [src].</span>")
|
||||
cut_overlays()
|
||||
I.forceMove(get_turf(src))
|
||||
icon_state = "evidenceobj"
|
||||
desc = "A container for holding body parts."
|
||||
else
|
||||
to_chat(user, "[src] is empty.")
|
||||
return
|
||||
@@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
/datum/uplink_item/dangerous/machinegun
|
||||
name = "L6 Squad Automatic Weapon"
|
||||
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \
|
||||
This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition."
|
||||
This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition."
|
||||
item = /obj/item/weapon/gun/ballistic/automatic/l6_saw
|
||||
cost = 18
|
||||
surplus = 0
|
||||
@@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/basic
|
||||
name = "5.56x45mm Box Magazine"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \
|
||||
name = "1.95x129mm Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
|
||||
By the time you need to use this, you'll already be on a pile of corpses."
|
||||
item = /obj/item/ammo_box/magazine/mm556x45
|
||||
item = /obj/item/ammo_box/magazine/mm195x129
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/bleeding
|
||||
name = "5.56x45mm (Bleeding) Box Magazine"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
name = "1.95x129mm (Bleeding) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
to induce internal bleeding on targets."
|
||||
item = /obj/item/ammo_box/magazine/mm556x45/bleeding
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/bleeding
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/hollow
|
||||
name = "5.56x45mm (Hollow-Point) Box Magazine"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
|
||||
name = "1.95x129mm (Hollow-Point) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
|
||||
with the unarmored masses of crew."
|
||||
item = /obj/item/ammo_box/magazine/mm556x45/hollow
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/hollow
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/ap
|
||||
name = "5.56x45mm (Armor Penetrating) Box Magazine"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
name = "1.95x129mm (Armor Penetrating) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
to puncture even the most durable armor."
|
||||
item = /obj/item/ammo_box/magazine/mm556x45/ap
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/ap
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/incen
|
||||
name = "5.56x45mm (Incendiary) Box Magazine"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \
|
||||
name = "1.95x129mm (Incendiary) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \
|
||||
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
|
||||
item = /obj/item/ammo_box/magazine/mm556x45/incen
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/incen
|
||||
|
||||
/datum/uplink_item/ammo/sniper
|
||||
cost = 4
|
||||
|
||||
Reference in New Issue
Block a user