mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 11:07:12 +01:00
Merge branch 'master' into runtime-fix-2
This commit is contained in:
@@ -44,6 +44,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
if("mod") rights |= R_MOD
|
||||
if("mentor") rights |= R_MENTOR
|
||||
if("proccall") rights |= R_PROCCALL
|
||||
if("viewruntimes") rights |= R_VIEWRUNTIMES
|
||||
|
||||
GLOB.admin_ranks[rank] = rights
|
||||
previous_rights = rights
|
||||
|
||||
@@ -230,7 +230,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
|
||||
/client/proc/add_admin_verbs()
|
||||
if(holder)
|
||||
verbs += GLOB.admin_verbs_default
|
||||
// If they have ANYTHING OTHER THAN ONLY VIEW RUNTIMES (65536), then give them the default admin verbs
|
||||
if(holder.rights != R_VIEWRUNTIMES)
|
||||
verbs += GLOB.admin_verbs_default
|
||||
if(holder.rights & R_BUILDMODE)
|
||||
verbs += /client/proc/togglebuildmodeself
|
||||
if(holder.rights & R_ADMIN)
|
||||
@@ -264,6 +266,8 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
verbs += GLOB.admin_verbs_mentor
|
||||
if(holder.rights & R_PROCCALL)
|
||||
verbs += GLOB.admin_verbs_proccall
|
||||
if(holder.rights & R_VIEWRUNTIMES)
|
||||
verbs += /client/proc/view_runtimes
|
||||
|
||||
/client/proc/remove_admin_verbs()
|
||||
verbs.Remove(
|
||||
|
||||
@@ -392,11 +392,12 @@
|
||||
var/logout_status
|
||||
logout_status = M.client ? "" : " <i>(logged out)</i>"
|
||||
var/dname = M.real_name
|
||||
var/area/A = get_area(M)
|
||||
if(!dname)
|
||||
dname = M
|
||||
|
||||
return {"<tr><td><a href='?src=[UID()];adminplayeropts=[M.UID()]'>[dname]</a><b>[caption]</b>[logout_status][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
|
||||
<td><A href='?src=[usr.UID()];priv_msg=[M.client ? M.client.UID() : null]'>PM</A></td>[close ? "</tr>" : ""]"}
|
||||
return {"<tr><td><a href='?src=[UID()];adminplayeropts=[M.UID()]'>[dname]</a><b>[caption]</b>[logout_status][istype(A, /area/security/permabrig) ? "<b><font color=red> (PERMA) </b></font>" : ""][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
|
||||
<td><A href='?src=[usr.UID()];priv_msg=[M.client ? M.client.UID() : null]'>PM</A> [ADMIN_FLW(M, "FLW")] </td>[close ? "</tr>" : ""]"}
|
||||
|
||||
/datum/admins/proc/check_antagonists()
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
@@ -492,7 +493,7 @@
|
||||
dat += check_role_table("Ninjas", ticker.mode.ninjas)*/
|
||||
|
||||
if(SSticker.mode.cult.len)
|
||||
dat += check_role_table("Cultists", SSticker.mode.cult, 0)
|
||||
dat += check_role_table("Cultists", SSticker.mode.cult)
|
||||
dat += "<br> use <a href='?src=[UID()];cult_mindspeak=[UID()]'>Cult Mindspeak</a>"
|
||||
if(GAMEMODE_IS_CULT)
|
||||
var/datum/game_mode/cult/cult_round = SSticker.mode
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<A href='?src=[UID()];secretsfun=monkey'>Turn all humans into monkeys</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=fakeguns'>Make all items look like guns</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=prisonwarp'>Warp all Players to Prison</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=retardify'>Make all players retarded</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=stupify'>Make all players stupid</A><BR>
|
||||
<b>Misc</b><br>
|
||||
<A href='?src=[UID()];secretsfun=sec_classic1'>Remove firesuits, grilles, and pods</A>
|
||||
<A href='?src=[UID()];secretsfun=tripleAI'>Triple AI mode (needs to be used in the lobby)</A><BR>
|
||||
|
||||
@@ -2813,13 +2813,13 @@
|
||||
return
|
||||
SSweather.run_weather(/datum/weather/ash_storm)
|
||||
message_admins("[key_name_admin(usr)] spawned an ash storm on the mining level")
|
||||
if("retardify")
|
||||
if("stupify")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","RET")
|
||||
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
||||
to_chat(H, "<span class='danger'>You suddenly feel stupid.</span>")
|
||||
H.setBrainLoss(60)
|
||||
message_admins("[key_name_admin(usr)] made everybody retarded")
|
||||
message_admins("[key_name_admin(usr)] made everybody stupid")
|
||||
if("fakeguns")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","FG")
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
/datum/pm_tracker
|
||||
var/current_title = ""
|
||||
var/open = FALSE
|
||||
var/list/pms = list()
|
||||
var/list/datum/pm_convo/pms = list()
|
||||
var/show_archived = FALSE
|
||||
var/window_id = "pms_window"
|
||||
|
||||
|
||||
@@ -832,7 +832,7 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
set name = "View Runtimes"
|
||||
set desc = "Open the Runtime Viewer"
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
if(!check_rights(R_DEBUG|R_VIEWRUNTIMES))
|
||||
return
|
||||
|
||||
GLOB.error_cache.showTo(usr)
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
var/output = "<b>Radio Report</b><hr>"
|
||||
for(var/fq in SSradio.frequencies)
|
||||
output += "<b>Freq: [fq]</b><br>"
|
||||
var/list/datum/radio_frequency/fqs = SSradio.frequencies[fq]
|
||||
var/datum/radio_frequency/fqs = SSradio.frequencies[fq]
|
||||
if(!fqs)
|
||||
output += " <b>ERROR</b><br>"
|
||||
continue
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
if(!themission)
|
||||
alert("No mission specified. Aborting.")
|
||||
return
|
||||
var/admin_outfits = subtypesof(/datum/outfit/admin)
|
||||
var/admin_outfits = subtypesof(/datum/outfit/admin) + list(/datum/outfit/naked)
|
||||
var/outfit_list = list()
|
||||
for(var/type in admin_outfits)
|
||||
var/datum/outfit/admin/O = type
|
||||
|
||||
@@ -7,4 +7,5 @@ GLOBAL_LIST_INIT(open_logging_views, list())
|
||||
|
||||
if(!GLOB.open_logging_views[usr.client.ckey])
|
||||
GLOB.open_logging_views[usr.client.ckey] = new /datum/log_viewer()
|
||||
GLOB.open_logging_views[usr.client.ckey].show_ui(usr)
|
||||
var/datum/log_viewer/LV = GLOB.open_logging_views[usr.client.ckey]
|
||||
LV.show_ui(usr)
|
||||
|
||||
@@ -543,7 +543,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
|
||||
var/var_value
|
||||
|
||||
if(param_var_name)
|
||||
if(!param_var_name in O.vars)
|
||||
if(!(param_var_name in O.vars))
|
||||
to_chat(src, "A variable with this name ([param_var_name]) doesn't exist in this datum ([O])")
|
||||
return
|
||||
variable = param_var_name
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
else if((H in GLOB.team_bravo) && (A in GLOB.team_bravo))
|
||||
to_chat(A, "<span class='warning'>He's on your team!</span>")
|
||||
return
|
||||
else if(!A in GLOB.team_alpha && !A in GLOB.team_bravo)
|
||||
else if(!(A in GLOB.team_alpha) && !(A in GLOB.team_bravo))
|
||||
to_chat(A, "<span class='warning'>You're not part of the dodgeball game, sorry!</span>")
|
||||
return
|
||||
else
|
||||
|
||||
@@ -533,7 +533,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/list/mobs = list()
|
||||
var/list/ghosts = list()
|
||||
var/list/sortmob = sortAtom(GLOB.mob_list) // get the mob list.
|
||||
/var/any=0
|
||||
var/any=0
|
||||
for(var/mob/dead/observer/M in sortmob)
|
||||
mobs.Add(M) //filter it where it's only ghosts
|
||||
any = 1 //if no ghosts show up, any will just be 0
|
||||
|
||||
@@ -58,7 +58,7 @@ GLOBAL_VAR(claw_game_html)
|
||||
atom_say("WINNER!")
|
||||
new /obj/item/toy/prizeball(get_turf(src))
|
||||
playsound(src.loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
addtimer(CALLBACK(src, .update_icon), 10)
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 10)
|
||||
|
||||
/obj/machinery/arcade/claw/start_play(mob/user as mob)
|
||||
..()
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
/obj/item/assembly/mousetrap/attack_hand(mob/living/user)
|
||||
if(armed)
|
||||
if((user.getBrainLoss() >= 60 || CLUMSY in user.mutations) && prob(50))
|
||||
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
field = json["field"]
|
||||
|
||||
Evaluate()
|
||||
if(sensor && field && sensor in parent.sensor_information)
|
||||
if(sensor && field && (sensor in parent.sensor_information))
|
||||
return parent.sensor_information[sensor][field]
|
||||
return 0
|
||||
|
||||
|
||||
@@ -163,11 +163,11 @@
|
||||
var/pda = -1
|
||||
var/backpack_contents = -1
|
||||
var/suit_store = -1
|
||||
|
||||
var/hair_style
|
||||
var/facial_hair_style
|
||||
var/skin_tone
|
||||
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
|
||||
/obj/effect/mob_spawn/human/Initialize()
|
||||
if(ispath(outfit))
|
||||
@@ -227,7 +227,6 @@
|
||||
if(!isnum(T))
|
||||
outfit.vars[slot] = T
|
||||
H.equipOutfit(outfit)
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
for(var/del_type in del_types)
|
||||
var/obj/item/I = locate(del_type) in H
|
||||
qdel(I)
|
||||
|
||||
@@ -172,87 +172,3 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "config/away
|
||||
new /obj/effect/landmark/ruin(central_turf, src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
|
||||
if(!z_levels || !z_levels.len)
|
||||
WARNING("No Z levels provided - Not generating ruins")
|
||||
return
|
||||
|
||||
for(var/zl in z_levels)
|
||||
var/turf/T = locate(1, 1, zl)
|
||||
if(!T)
|
||||
WARNING("Z level [zl] does not exist - Not generating ruins")
|
||||
return
|
||||
|
||||
var/list/ruins = potentialRuins.Copy()
|
||||
|
||||
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default)
|
||||
var/list/ruins_availible = list() //we can try these in the current pass
|
||||
var/forced_z //If set we won't pick z level and use this one instead.
|
||||
|
||||
//Set up the starting ruin list
|
||||
for(var/key in ruins)
|
||||
var/datum/map_template/ruin/R = ruins[key]
|
||||
if(R.cost > budget) //Why would you do that
|
||||
continue
|
||||
if(R.always_place)
|
||||
forced_ruins[R] = -1
|
||||
if(R.unpickable)
|
||||
continue
|
||||
ruins_availible[R] = R.placement_weight
|
||||
|
||||
while(budget > 0 && (ruins_availible.len || forced_ruins.len))
|
||||
var/datum/map_template/ruin/current_pick
|
||||
var/forced = FALSE
|
||||
if(forced_ruins.len) //We have something we need to load right now, so just pick it
|
||||
for(var/ruin in forced_ruins)
|
||||
current_pick = ruin
|
||||
if(forced_ruins[ruin] > 0) //Load into designated z
|
||||
forced_z = forced_ruins[ruin]
|
||||
forced = TRUE
|
||||
break
|
||||
else //Otherwise just pick random one
|
||||
current_pick = pickweight(ruins_availible)
|
||||
|
||||
var/placement_tries = PLACEMENT_TRIES
|
||||
var/failed_to_place = TRUE
|
||||
var/z_placed = 0
|
||||
while(placement_tries > 0)
|
||||
placement_tries--
|
||||
z_placed = pick(z_levels)
|
||||
if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist))
|
||||
continue
|
||||
else
|
||||
failed_to_place = FALSE
|
||||
break
|
||||
|
||||
//That's done remove from priority even if it failed
|
||||
if(forced)
|
||||
//TODO : handle forced ruins with multiple variants
|
||||
forced_ruins -= current_pick
|
||||
forced = FALSE
|
||||
|
||||
if(failed_to_place)
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.id == current_pick.id)
|
||||
ruins_availible -= R
|
||||
log_world("Failed to place [current_pick.name] ruin.")
|
||||
else
|
||||
budget -= current_pick.cost
|
||||
if(!current_pick.allow_duplicates)
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.id == current_pick.id)
|
||||
ruins_availible -= R
|
||||
if(current_pick.never_spawn_with)
|
||||
for(var/blacklisted_type in current_pick.never_spawn_with)
|
||||
for(var/possible_exclusion in ruins_availible)
|
||||
if(istype(possible_exclusion,blacklisted_type))
|
||||
ruins_availible -= possible_exclusion
|
||||
forced_z = 0
|
||||
|
||||
//Update the availible list
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.cost > budget)
|
||||
ruins_availible -= R
|
||||
|
||||
log_world("Ruin loader finished with [budget] left to spend.")
|
||||
|
||||
@@ -46,17 +46,21 @@
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
|
||||
P.id_tag = null
|
||||
to_chat(user, "[P] unlinked.")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
if(!M.normaldoorcontrol)
|
||||
if(link_lines.len && alert(user, "Warning: This will disable links to connected pod doors. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
M.normaldoorcontrol = 1
|
||||
if(P.id_tag && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
P.id_tag = M.id
|
||||
if(istype(link_obj, /obj/machinery/door_control) && istype(object, /obj/machinery/door/poddoor))
|
||||
var/obj/machinery/door_control/M = link_obj
|
||||
@@ -64,24 +68,29 @@
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
|
||||
P.id_tag = null
|
||||
to_chat(user, "[P] unlinked.")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
if(M.normaldoorcontrol)
|
||||
if(link_lines.len && alert(user, "Warning: This will disable links to connected airlocks. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
M.normaldoorcontrol = 0
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
if(P.id_tag && P.id_tag != 1 && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto line_jump
|
||||
speed_execute()
|
||||
return
|
||||
P.id_tag = M.id
|
||||
|
||||
line_jump // For the goto
|
||||
/datum/buildmode_mode/link/proc/speed_execute() // For exiting out of hell
|
||||
clear_lines()
|
||||
|
||||
if(istype(link_obj, /obj/machinery/door_control))
|
||||
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
/client/proc/is_connecting_from_localhost()
|
||||
var/localhost_addresses = list("127.0.0.1", "::1") // Adresses
|
||||
if(!isnull(address) && address in localhost_addresses)
|
||||
if(!isnull(address) && (address in localhost_addresses))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
var/unlock_content = 0
|
||||
|
||||
//Gear stuff
|
||||
var/list/gear = list()
|
||||
var/list/loadout_gear = list()
|
||||
var/gear_tab = "General"
|
||||
// Parallax
|
||||
var/parallax = PARALLAX_HIGH
|
||||
@@ -508,9 +508,9 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
if(TAB_GEAR)
|
||||
var/total_cost = 0
|
||||
var/list/type_blacklist = list()
|
||||
if(gear && gear.len)
|
||||
for(var/i = 1, i <= gear.len, i++)
|
||||
var/datum/gear/G = GLOB.gear_datums[gear[i]]
|
||||
if(loadout_gear && loadout_gear.len)
|
||||
for(var/i = 1, i <= loadout_gear.len, i++)
|
||||
var/datum/gear/G = GLOB.gear_datums[loadout_gear[i]]
|
||||
if(G)
|
||||
if(!G.subtype_cost_overlap)
|
||||
if(G.subtype_path in type_blacklist)
|
||||
@@ -543,7 +543,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
dat += "<tr><td colspan=4><hr></td></tr>"
|
||||
for(var/gear_name in LC.gear)
|
||||
var/datum/gear/G = LC.gear[gear_name]
|
||||
var/ticked = (G.display_name in gear)
|
||||
var/ticked = (G.display_name in loadout_gear)
|
||||
if(G.donator_tier > user.client.donator_level)
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><B>[G.display_name]</B></td>"
|
||||
else
|
||||
@@ -576,10 +576,10 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
|
||||
|
||||
/datum/preferences/proc/get_gear_metadata(var/datum/gear/G)
|
||||
. = gear[G.display_name]
|
||||
. = loadout_gear[G.display_name]
|
||||
if(!.)
|
||||
. = list()
|
||||
gear[G.display_name] = .
|
||||
loadout_gear[G.display_name] = .
|
||||
|
||||
/datum/preferences/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak)
|
||||
var/list/metadata = get_gear_metadata(G)
|
||||
@@ -721,7 +721,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
HTML += "</td></tr>"
|
||||
|
||||
for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even
|
||||
HTML += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'> </td><td> </td></tr>"
|
||||
HTML += "<tr bgcolor='[lastJob ? lastJob.selection_color : "#ffffff"]'><td width='60%' align='right'> </td><td> </td></tr>"
|
||||
|
||||
HTML += "</td'></tr></table>"
|
||||
|
||||
@@ -1162,15 +1162,15 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
if(href_list["preference"] == "gear")
|
||||
if(href_list["toggle_gear"])
|
||||
var/datum/gear/TG = GLOB.gear_datums[href_list["toggle_gear"]]
|
||||
if(TG.display_name in gear)
|
||||
gear -= TG.display_name
|
||||
if(TG.display_name in loadout_gear)
|
||||
loadout_gear -= TG.display_name
|
||||
else
|
||||
if(TG.donator_tier && user.client.donator_level < TG.donator_tier)
|
||||
to_chat(user, "<span class='warning'>That gear is only available at a higher donation tier than you are on.</span>")
|
||||
return
|
||||
var/total_cost = 0
|
||||
var/list/type_blacklist = list()
|
||||
for(var/gear_name in gear)
|
||||
for(var/gear_name in loadout_gear)
|
||||
var/datum/gear/G = GLOB.gear_datums[gear_name]
|
||||
if(istype(G))
|
||||
if(!G.subtype_cost_overlap)
|
||||
@@ -1180,7 +1180,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
total_cost += G.cost
|
||||
|
||||
if((total_cost + TG.cost) <= max_gear_slots)
|
||||
gear += TG.display_name
|
||||
loadout_gear += TG.display_name
|
||||
|
||||
else if(href_list["gear"] && href_list["tweak"])
|
||||
var/datum/gear/gear = GLOB.gear_datums[href_list["gear"]]
|
||||
@@ -1194,7 +1194,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
else if(href_list["select_category"])
|
||||
gear_tab = href_list["select_category"]
|
||||
else if(href_list["clear_loadout"])
|
||||
gear.Cut()
|
||||
loadout_gear.Cut()
|
||||
|
||||
ShowChoices(user)
|
||||
return
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
//socks
|
||||
socks = query.item[49]
|
||||
body_accessory = query.item[50]
|
||||
gear = params2list(query.item[51])
|
||||
loadout_gear = params2list(query.item[51])
|
||||
autohiss_mode = text2num(query.item[52])
|
||||
|
||||
//Sanitize
|
||||
@@ -318,7 +318,7 @@
|
||||
if(!player_alt_titles) player_alt_titles = new()
|
||||
if(!organ_data) src.organ_data = list()
|
||||
if(!rlimb_data) src.rlimb_data = list()
|
||||
if(!gear) gear = list()
|
||||
if(!loadout_gear) loadout_gear = list()
|
||||
|
||||
return 1
|
||||
|
||||
@@ -336,8 +336,8 @@
|
||||
rlimblist = list2params(rlimb_data)
|
||||
if(!isemptylist(player_alt_titles))
|
||||
playertitlelist = list2params(player_alt_titles)
|
||||
if(!isemptylist(gear))
|
||||
gearlist = list2params(gear)
|
||||
if(!isemptylist(loadout_gear))
|
||||
gearlist = list2params(loadout_gear)
|
||||
|
||||
var/DBQuery/firstquery = GLOB.dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot")
|
||||
firstquery.Execute()
|
||||
@@ -493,7 +493,8 @@
|
||||
|
||||
/datum/preferences/proc/SetChangelog(client/C,hash)
|
||||
lastchangelog=hash
|
||||
if(GLOB.preferences_datums[C.ckey].toggles & UI_DARKMODE)
|
||||
var/datum/preferences/P = GLOB.preferences_datums[C.ckey]
|
||||
if(P.toggles & UI_DARKMODE)
|
||||
winset(C, "rpane.changelog", "background-color=#40628a;font-color=#ffffff;font-style=none")
|
||||
else
|
||||
winset(C, "rpane.changelog", "background-color=none;font-style=none")
|
||||
|
||||
@@ -335,7 +335,6 @@ BLIND // can't see anything
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
set_sensors(usr)
|
||||
..()
|
||||
|
||||
//Head
|
||||
/obj/item/clothing/head
|
||||
@@ -563,7 +562,7 @@ BLIND // can't see anything
|
||||
return
|
||||
user.update_inv_wear_suit()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.</span>")
|
||||
to_chat(user, "<span class='notice'>You attempt to button up the velcro on \the [src], before promptly realising how foolish you are.</span>")
|
||||
|
||||
/obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis.
|
||||
..()
|
||||
@@ -739,7 +738,7 @@ BLIND // can't see anything
|
||||
if(!usr.incapacitated())
|
||||
if(copytext(item_color,-2) != "_d")
|
||||
basecolor = item_color
|
||||
if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi'))
|
||||
if((basecolor + "_d_s") in icon_states('icons/mob/uniform.dmi'))
|
||||
item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]"
|
||||
usr.update_inv_w_uniform()
|
||||
else
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
phaseanim.loc = to_turf
|
||||
sleep(7)
|
||||
if(holder)
|
||||
if(user && user in holder.contents)
|
||||
if(user && (user in holder.contents))
|
||||
user.loc = to_turf
|
||||
if(user.client)
|
||||
if(camera)
|
||||
|
||||
@@ -93,14 +93,14 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/security
|
||||
name = "security plasma envirosuit helmet"
|
||||
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
|
||||
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, alongside other undesirables."
|
||||
icon_state = "security_envirohelm"
|
||||
item_state = "security_envirohelm"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
|
||||
name = "warden's plasma envirosuit helmet"
|
||||
desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
|
||||
desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differentiate them from other members of security."
|
||||
icon_state = "warden_envirohelm"
|
||||
item_state = "warden_envirohelm"
|
||||
|
||||
@@ -111,14 +111,14 @@
|
||||
item_state = "hos_envirohelm"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/medical
|
||||
name = "medical's plasma envirosuit helmet"
|
||||
desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much"
|
||||
name = "medical plasma envirosuit helmet"
|
||||
desc = "An envirohelmet designed for plasmaman medical doctors, having two stripes down its length to denote as much."
|
||||
icon_state = "doctor_envirohelm"
|
||||
item_state = "doctor_envirohelm"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/cmo
|
||||
name = "chief medical officer's plasma envirosuit helmet"
|
||||
desc = "An envriohelmet designed for plasmaman employed as the cheif medical officer."
|
||||
desc = "An envirohelmet designed for plasmamen employed as the chief medical officer."
|
||||
icon_state = "cmo_envirohelm"
|
||||
item_state = "cmo_envirohelm"
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/chemist
|
||||
name = "chemistry plasma envirosuit helmet"
|
||||
desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
|
||||
desc = "A plasmaman envirohelmet designed for chemists, two orange stripes going down its face."
|
||||
icon_state = "chemist_envirohelm"
|
||||
item_state = "chemist_envirohelm"
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
|
||||
name = "chief engineer's plasma envirosuit helmet"
|
||||
desc = "A space-worthy helmet specially designed for chief engineer employed plasmamen."
|
||||
desc = "A space-worthy helmet specially designed for plasmamen employed as the chief engineer."
|
||||
icon_state = "ce_envirohelm"
|
||||
item_state = "ce_envirohelm"
|
||||
|
||||
@@ -179,13 +179,13 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/cargo
|
||||
name = "cargo plasma envirosuit helmet"
|
||||
desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
|
||||
desc = "A plasmaman envirohelmet designed for cargo techs and quartermasters."
|
||||
icon_state = "cargo_envirohelm"
|
||||
item_state = "cargo_envirohelm"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/mining
|
||||
name = "mining plasma envirosuit helmet"
|
||||
desc = "A khaki helmet given to plasmamen miners operating on lavaland."
|
||||
desc = "A khaki helmet given to plasmamen miners operating on Lavaland."
|
||||
icon_state = "explorer_envirohelm"
|
||||
item_state = "explorer_envirohelm"
|
||||
visor_icon = "explorer_envisor"
|
||||
@@ -210,7 +210,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/librarian
|
||||
name = "librarian's plasma envirosuit helmet"
|
||||
desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
|
||||
desc = "A slight modification on a traditional voidsuit helmet, this helmet was Nanotrasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
|
||||
icon_state = "prototype_envirohelm"
|
||||
item_state = "prototype_envirohelm"
|
||||
actions_types = list(/datum/action/item_action/toggle_welding_screen/plasmaman)
|
||||
@@ -218,7 +218,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/botany
|
||||
name = "botany plasma envirosuit helmet"
|
||||
desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
|
||||
desc = "A green and blue envirohelmet designating its wearer as a botanist. While not specially designed for it, it would protect against minor plant-related injuries."
|
||||
icon_state = "botany_envirohelm"
|
||||
item_state = "botany_envirohelm"
|
||||
|
||||
@@ -230,14 +230,14 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/mime
|
||||
name = "mime envirosuit helmet"
|
||||
desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
|
||||
desc = "The makeup is painted on, it's a miracle it doesn't chip. It's not very colourful."
|
||||
icon_state = "mime_envirohelm"
|
||||
item_state = "mime_envirohelm"
|
||||
visor_icon = "mime_envisor"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/clown
|
||||
name = "clown envirosuit helmet"
|
||||
desc = "The make-up is painted on, it's a miracle it doesn't chip. <i>'HONK!'</i>"
|
||||
desc = "The makeup is painted on, it's a miracle it doesn't chip. <i>'HONK!'</i>"
|
||||
icon_state = "clown_envirohelm"
|
||||
item_state = "clown_envirohelm"
|
||||
visor_icon = "clown_envisor"
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
to_chat(usr, "Your module is not installed in a hardsuit.")
|
||||
return
|
||||
|
||||
module.holder.ui_interact(usr, nano_state = GLOB.contained_state)
|
||||
module.holder.ui_interact(usr, state = GLOB.contained_state)
|
||||
|
||||
/obj/item/rig_module/ai_container
|
||||
|
||||
|
||||
@@ -958,7 +958,7 @@
|
||||
if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing
|
||||
return
|
||||
|
||||
if(!linked_staff in range(3, get_turf(src))) //staff won't charge at range (to prevent it from being handed off / stolen and used)
|
||||
if(!(linked_staff in range(3, get_turf(src)))) //staff won't charge at range (to prevent it from being handed off / stolen and used)
|
||||
if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent.
|
||||
to_chat(H, "<span class='warning'>Your staff is unable to charge at this range. Get closer!</span>")
|
||||
return
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard
|
||||
name = "battlemage armour"
|
||||
desc = "Not all wizards are afraid of getting up close and personal."
|
||||
desc = "Not all wizards are afraid of getting up close and personal. Not spaceproof despite its appearance."
|
||||
icon_state = "hardsuit-wiz"
|
||||
item_state = "wiz_hardsuit"
|
||||
recharge_rate = 0
|
||||
@@ -172,6 +172,15 @@
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard/arch
|
||||
desc = "For the arch wizard in need of additional protection."
|
||||
recharge_rate = 1
|
||||
recharge_cooldown = 0
|
||||
max_charges = 15
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/arch
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard
|
||||
name = "battlemage helmet"
|
||||
desc = "A suitably impressive helmet."
|
||||
@@ -188,6 +197,11 @@
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/arch
|
||||
desc = "A truly protective helmet."
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
|
||||
/obj/item/wizard_armour_charge
|
||||
name = "battlemage shield charges"
|
||||
desc = "A powerful rune that will increase the number of hits a suit of battlemage armour can take before failing.."
|
||||
|
||||
@@ -356,6 +356,8 @@
|
||||
var/fail_msg = construct_item(usr, TR)
|
||||
if(!fail_msg)
|
||||
to_chat(usr, "<span class='notice'>[TR.name] constructed.</span>")
|
||||
if(TR.alert_admins_on_craft)
|
||||
message_admins("[usr.ckey] has created a [TR.name] at [ADMIN_COORDJMP(usr)]")
|
||||
else
|
||||
to_chat(usr, "<span class ='warning'>Construction failed[fail_msg]</span>")
|
||||
busy = FALSE
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/category = CAT_NONE //where it shows up in the crafting UI
|
||||
var/subcategory = CAT_NONE
|
||||
var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
|
||||
var/alert_admins_on_craft = FALSE
|
||||
|
||||
/datum/crafting_recipe/IED
|
||||
name = "IED"
|
||||
@@ -94,6 +95,7 @@
|
||||
tools = list(TOOL_WELDER)
|
||||
time = 120
|
||||
category = CAT_ROBOT
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/cleanbot
|
||||
name = "Cleanbot"
|
||||
@@ -147,6 +149,7 @@
|
||||
time = 10
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/meteorshot
|
||||
name = "Meteorshot Shell"
|
||||
@@ -259,6 +262,7 @@
|
||||
time = 50
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/spear
|
||||
name = "Spear"
|
||||
@@ -378,6 +382,7 @@
|
||||
time = 30
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/chemical_payload2
|
||||
name = "Chemical Payload (gibtonite)"
|
||||
@@ -391,6 +396,7 @@
|
||||
time = 50
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/toxins_payload
|
||||
name = "Toxins Payload Casing"
|
||||
@@ -503,6 +509,7 @@
|
||||
reqs = list(/obj/item/grown/log = 5)
|
||||
result = /obj/structure/bonfire
|
||||
category = CAT_PRIMAL
|
||||
alert_admins_on_craft = TRUE
|
||||
|
||||
/datum/crafting_recipe/rake //Category resorting incoming
|
||||
name = "Rake"
|
||||
@@ -611,8 +618,8 @@
|
||||
name = "Paper Jack o'Lantern"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/jack_o_lantern
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/pen,
|
||||
/obj/item/toy/crayon/orange,
|
||||
pathtools = list(/obj/item/pen,
|
||||
/obj/item/toy/crayon/orange,
|
||||
/obj/item/toy/crayon/green)//pen ink is black
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -629,7 +636,7 @@
|
||||
name = "Paper Spider"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/spider
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/pen,
|
||||
pathtools = list(/obj/item/pen,
|
||||
/obj/item/toy/crayon/red)
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -670,7 +677,7 @@
|
||||
name = "Paper Snowman"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/snowman
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/pen,
|
||||
pathtools = list(/obj/item/pen,
|
||||
/obj/item/toy/crayon/orange)
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -687,9 +694,9 @@
|
||||
name = "Paper Christmas Tree"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/christmas_tree
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
/obj/item/toy/crayon/yellow,
|
||||
/obj/item/toy/crayon/blue,
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
/obj/item/toy/crayon/yellow,
|
||||
/obj/item/toy/crayon/blue,
|
||||
/obj/item/toy/crayon/green)
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -714,7 +721,7 @@
|
||||
name = "Paper Mistletoe"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/mistletoe
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
/obj/item/toy/crayon/green)
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -723,7 +730,7 @@
|
||||
name = "Paper Holly"
|
||||
result = /obj/item/decorations/sticky_decorations/flammable/holly
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
pathtools = list(/obj/item/toy/crayon/red,
|
||||
/obj/item/toy/crayon/green)
|
||||
category = CAT_DECORATIONS
|
||||
subcategory = CAT_HOLIDAY
|
||||
@@ -1012,7 +1019,7 @@
|
||||
/obj/item/stack/rods = 4,
|
||||
/obj/item/stock_parts/cell = 1,
|
||||
/obj/item/stack/cable_coil = 4)//thing is a wireframe construct with an electro magnetic hover field
|
||||
tools = list(TOOL_WIRECUTTER,
|
||||
tools = list(TOOL_WIRECUTTER,
|
||||
TOOL_WELDER)
|
||||
pathtools = list(/obj/item/pen,
|
||||
/obj/item/toy/crayon/red)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
/obj/item/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob,proximity)
|
||||
if(!proximity) return
|
||||
if(istype(A) && src in user)
|
||||
if(istype(A) && (src in user))
|
||||
user.visible_message("[user] starts to wipe down [A] with [src]!")
|
||||
if(do_after(user, wipespeed, target = A))
|
||||
user.visible_message("[user] finishes wiping off the [A]!")
|
||||
|
||||
@@ -237,9 +237,9 @@ log transactions
|
||||
playsound(src, 'sound/machines/chime.ogg', 50, 1)
|
||||
|
||||
//remove the money
|
||||
if(amount > 10000) // prevent crashes
|
||||
to_chat(usr, "<span class='notice'>The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'</span>")
|
||||
amount = 10000
|
||||
if(amount > 100000) // prevent crashes
|
||||
to_chat(usr, "<span class='notice'>The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 100,000.'</span>")
|
||||
amount = 100000
|
||||
withdraw_arbitrary_sum(amount)
|
||||
authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name)
|
||||
else
|
||||
|
||||
@@ -40,7 +40,7 @@ GLOBAL_VAR(current_date_string)
|
||||
return 0
|
||||
if(ACCESS_CENT_COMMANDER in held_card.access)
|
||||
return 2
|
||||
else if(ACCESS_HOP in held_card.access || ACCESS_CAPTAIN in held_card.access)
|
||||
else if((ACCESS_HOP in held_card.access) || (ACCESS_CAPTAIN in held_card.access))
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name)
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/card))
|
||||
var/obj/item/card/id/C = I
|
||||
if(ACCESS_CENT_COMMANDER in C.access || ACCESS_HOP in C.access || ACCESS_CAPTAIN in C.access)
|
||||
if((ACCESS_CENT_COMMANDER in C.access) || (ACCESS_HOP in C.access) || (ACCESS_CAPTAIN in C.access))
|
||||
access_code = 0
|
||||
to_chat(usr, "[bicon(src)]<span class='info'>Access code reset to 0.</span>")
|
||||
else if(istype(I, /obj/item/card/emag))
|
||||
@@ -190,8 +190,4 @@
|
||||
playsound(src, 'sound/machines/chime.ogg', 50, 1)
|
||||
visible_message("[bicon(src)] The [src] chimes.")
|
||||
transaction_paid = 1
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
//emag?
|
||||
|
||||
@@ -194,7 +194,7 @@ GLOBAL_LIST_EMPTY(event_last_fired)
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
|
||||
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
|
||||
//new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 180, is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
|
||||
|
||||
@@ -80,18 +80,23 @@
|
||||
if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
|
||||
continue
|
||||
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
|
||||
active_with_role["Engineer"]++
|
||||
if(istype(M, /mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.module && (R.module.name == "engineering robot module"))
|
||||
active_with_role["Engineer"]++
|
||||
|
||||
if(R.module && (R.module.name == "medical robot module"))
|
||||
active_with_role["Medical"]++
|
||||
|
||||
if(R.module && (R.module.name == "security robot module"))
|
||||
active_with_role["Security"]++
|
||||
|
||||
if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer"))
|
||||
active_with_role["Engineer"]++
|
||||
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module")
|
||||
active_with_role["Medical"]++
|
||||
if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor"))
|
||||
active_with_role["Medical"]++
|
||||
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module")
|
||||
active_with_role["Security"]++
|
||||
if(M.mind.assigned_role in GLOB.security_positions)
|
||||
active_with_role["Security"]++
|
||||
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
#define ION_NOANNOUNCEMENT -1
|
||||
#define ION_RANDOM 0
|
||||
#define ION_ANNOUNCE 1
|
||||
|
||||
/datum/event/ion_storm
|
||||
var/botEmagChance = 10
|
||||
var/announceEvent = ION_RANDOM // -1 means don't announce, 0 means have it randomly announce, 1 means
|
||||
var/announceEvent = ION_NOANNOUNCEMENT // -1 means don't announce, 0 means have it randomly announce, 1 means
|
||||
var/ionMessage = null
|
||||
var/ionAnnounceChance = 33
|
||||
announceWhen = 1
|
||||
|
||||
/datum/event/ion_storm/New(var/botEmagChance = 10, var/announceEvent = ION_RANDOM, var/ionMessage = null, var/ionAnnounceChance = 33)
|
||||
/datum/event/ion_storm/New(var/botEmagChance = 10, var/announceEvent = ION_NOANNOUNCEMENT, var/ionMessage = null, var/ionAnnounceChance = 33)
|
||||
src.botEmagChance = botEmagChance
|
||||
src.announceEvent = announceEvent
|
||||
src.ionMessage = ionMessage
|
||||
@@ -19,11 +20,10 @@
|
||||
if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)))
|
||||
GLOB.event_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
|
||||
|
||||
|
||||
/datum/event/ion_storm/start()
|
||||
//AI laws
|
||||
for(var/mob/living/silicon/ai/M in GLOB.living_mob_list)
|
||||
if(M.stat != 2 && M.see_in_dark != 0)
|
||||
if(M.stat != DEAD && M.see_in_dark != FALSE)
|
||||
var/message = generate_ion_law(ionMessage)
|
||||
if(message)
|
||||
M.add_ion_law(message)
|
||||
@@ -491,7 +491,7 @@
|
||||
return message
|
||||
|
||||
/proc/generate_static_ion_law()
|
||||
/var/list/players = list()
|
||||
var/list/players = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > MinutesToTicks(10))
|
||||
continue
|
||||
@@ -556,5 +556,6 @@
|
||||
"There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
|
||||
return pick(laws)
|
||||
|
||||
#undef ION_NOANNOUNCEMENT
|
||||
#undef ION_RANDOM
|
||||
#undef ION_ANNOUNCE
|
||||
|
||||
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
|
||||
GLOB.event_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
|
||||
// if the docking request was refused, fire another major event in 60 seconds
|
||||
var/list/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MAJOR]
|
||||
var/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MAJOR]
|
||||
EC.next_event_time = world.time + (60 * 10)
|
||||
return
|
||||
|
||||
|
||||
@@ -732,7 +732,7 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/projectile, /obj/ite
|
||||
var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]","Where's [target.name]?","Call the shuttle!","AI rogue!!")
|
||||
|
||||
var/list/mob/living/carbon/people = list()
|
||||
var/list/mob/living/carbon/person = null
|
||||
var/mob/living/carbon/person = null
|
||||
for(var/mob/living/carbon/H in view(target))
|
||||
if(H == target)
|
||||
continue
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
bro.cell.use(chargeAmount)
|
||||
to_chat(user, "<span class='notice'>Now synthesizing [trans] units of [refillName]...</span>")
|
||||
addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, trans), 300)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/__to_chat, user, "<span class='notice'>Cyborg [src] refilled.</span>"), 300)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, user, "<span class='notice'>Cyborg [src] refilled.</span>"), 300)
|
||||
|
||||
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
|
||||
if(!is_refillable())
|
||||
|
||||
@@ -77,7 +77,22 @@
|
||||
new /obj/item/reagent_containers/food/snacks/raw_bacon(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/bearmeat
|
||||
//////////////////////////
|
||||
// Monster Meat //
|
||||
//////////////////////////
|
||||
|
||||
// Cannot be used in the usual meat-based food recipies but can be used as cloning pod biomass.
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat
|
||||
// Abstract object used for inheritance. I don't see why you would want one.
|
||||
// It's just a convenience to set all monstermeats as biomass-able at once,
|
||||
// in the GLOB.cloner_biomass_items list.
|
||||
// DOES NOT SPAWN NATURALLY!
|
||||
name = "abstract monster meat"
|
||||
desc = "A slab of abstract monster meat. This shouldn't exist, contact a coder about this if you are seeing it in-game."
|
||||
icon_state = "bearmeat"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/bearmeat
|
||||
name = "bear meat"
|
||||
desc = "A very manly slab of meat."
|
||||
icon_state = "bearmeat"
|
||||
@@ -86,7 +101,7 @@
|
||||
list_reagents = list("protein" = 12, "morphine" = 5, "vitamin" = 2)
|
||||
tastes = list("meat" = 1, "salmon" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat
|
||||
name = "meat"
|
||||
desc = "A slab of meat. It's green!"
|
||||
icon_state = "xenomeat"
|
||||
@@ -95,7 +110,7 @@
|
||||
list_reagents = list("protein" = 3, "vitamin" = 1)
|
||||
tastes = list("meat" = 1, "acid" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/spidermeat
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat
|
||||
name = "spider meat"
|
||||
desc = "A slab of spider meat. Not very appetizing."
|
||||
icon_state = "spidermeat"
|
||||
@@ -103,7 +118,7 @@
|
||||
list_reagents = list("protein" = 3, "toxin" = 3, "vitamin" = 1)
|
||||
tastes = list("cobwebs" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/lizardmeat
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat
|
||||
name = "mutant lizard meat"
|
||||
desc = "A peculiar slab of meat. It looks scaly and radioactive."
|
||||
icon_state = "xenomeat"
|
||||
@@ -112,7 +127,7 @@
|
||||
list_reagents = list("protein" = 3, "toxin" = 3)
|
||||
tastes = list("tough meat" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spiderleg
|
||||
name = "spider leg"
|
||||
desc = "A still twitching leg of a giant spider. You don't really want to eat this, do you?"
|
||||
icon_state = "spiderleg"
|
||||
@@ -126,21 +141,21 @@
|
||||
list_reagents = list("nutriment" = 1, "porktonium" = 10)
|
||||
tastes = list("bacon" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spidereggs
|
||||
name = "spider eggs"
|
||||
desc = "A cluster of juicy spider eggs. A great side dish for when you don't care about your health."
|
||||
icon_state = "spidereggs"
|
||||
list_reagents = list("protein" = 2, "toxin" = 2)
|
||||
tastes = list("cobwebs" = 1, "spider juice" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/goliath
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/goliath
|
||||
name = "goliath meat"
|
||||
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
|
||||
icon_state = "goliathmeat"
|
||||
list_reagents = list("protein" = 3, "toxin" = 5)
|
||||
tastes = list("tough meat" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/goliath/burn()
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/goliath/burn()
|
||||
visible_message("<span class='notice'>[src] finishes cooking!</span>")
|
||||
new /obj/item/reagent_containers/food/snacks/goliath_steak(loc)
|
||||
qdel(src)
|
||||
@@ -243,7 +258,7 @@
|
||||
trash = null
|
||||
list_reagents = list("protein" = 6, "vitamin" = 2)
|
||||
tastes = list("meat" = 1)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/fried_vox
|
||||
name = "Kentucky Fried Vox"
|
||||
desc = "Bucket of voxxy, yaya!"
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
trash = /obj/item/stack/rods
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "shrimpskewer"
|
||||
bitesize = 3
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 8)
|
||||
tastes = list("shrimp" = 4)
|
||||
|
||||
|
||||
@@ -273,7 +273,6 @@
|
||||
// reagents.add_reagent("nutriment", 2) // this line of code for all the contents.
|
||||
// bitesize = 3 //This is the amount each bite consumes.
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/badrecipe
|
||||
name = "burned mess"
|
||||
desc = "Someone should be demoted from chef for this."
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
/datum/recipe/grill/wingfangchu
|
||||
reagents = list("soysauce" = 5)
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/wingfangchu
|
||||
|
||||
@@ -228,11 +228,9 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_Tai
|
||||
|
||||
/datum/recipe/grill/goliath
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/goliath
|
||||
)
|
||||
items = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath)
|
||||
result = /obj/item/reagent_containers/food/snacks/goliath_steak
|
||||
|
||||
|
||||
/datum/recipe/grill/shrimp_skewer
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/shrimp,
|
||||
|
||||
@@ -87,8 +87,7 @@
|
||||
/datum/recipe/microwave/xenoburger
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/bun,
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat
|
||||
)
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat )
|
||||
result = /obj/item/reagent_containers/food/snacks/xenoburger
|
||||
|
||||
/datum/recipe/microwave/fishburger
|
||||
@@ -630,22 +629,22 @@ datum/recipe/microwave/slimesandwich
|
||||
/datum/recipe/microwave/boiledspiderleg
|
||||
reagents = list("water" = 10)
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spiderleg
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/boiledspiderleg
|
||||
|
||||
/datum/recipe/microwave/spidereggsham
|
||||
reagents = list("sodiumchloride" = 1)
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs,
|
||||
/obj/item/reagent_containers/food/snacks/spidermeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spidereggs,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/spidereggsham
|
||||
|
||||
/datum/recipe/microwave/sashimi
|
||||
reagents = list("soysauce" = 5)
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spidereggs,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sashimi
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/dough,
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge,
|
||||
@@ -115,7 +115,7 @@
|
||||
/datum/recipe/oven/xemeatpie
|
||||
items = list(
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/xemeatpie
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
anchored = TRUE
|
||||
buckle_lying = FALSE
|
||||
var/burning = 0
|
||||
var/lighter // Who lit the fucking thing
|
||||
var/fire_stack_strength = 5
|
||||
|
||||
/obj/structure/bonfire/dense
|
||||
@@ -125,6 +126,8 @@
|
||||
var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16)
|
||||
underlays += U
|
||||
if(is_hot(W))
|
||||
lighter = user.ckey
|
||||
user.create_log(MISC_LOG, "lit a bonfire", src)
|
||||
StartBurning()
|
||||
|
||||
|
||||
@@ -163,6 +166,9 @@
|
||||
/obj/structure/bonfire/Crossed(atom/movable/AM, oldloc)
|
||||
if(burning)
|
||||
Burn()
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
add_attack_logs(src, H, "Burned by a bonfire (Lit by [lighter])", ATKLOG_ALMOSTALL)
|
||||
|
||||
/obj/structure/bonfire/proc/Burn()
|
||||
var/turf/current_location = get_turf(src)
|
||||
|
||||
@@ -560,7 +560,7 @@
|
||||
if(S.has_reagent("charcoal", 1))
|
||||
adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
|
||||
|
||||
// NIGGA, YOU JUST WENT ON FULL RETARD.
|
||||
// BRO, YOU JUST WENT ON FULL STUPID.
|
||||
if(S.has_reagent("toxin", 1))
|
||||
adjustToxic(round(S.get_reagent_amount("toxin") * 2))
|
||||
|
||||
@@ -619,7 +619,7 @@
|
||||
adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1))
|
||||
adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1))
|
||||
|
||||
// Man, you guys are retards
|
||||
// Man, you guys are daft
|
||||
if(S.has_reagent("sacid", 1))
|
||||
adjustHealth(-round(S.get_reagent_amount("sacid") * 1))
|
||||
adjustToxic(round(S.get_reagent_amount("sacid") * 1.5))
|
||||
|
||||
@@ -348,14 +348,14 @@
|
||||
for(var/i in 1 to seed.growthstages)
|
||||
if("[seed.icon_grow][i]" in states)
|
||||
continue
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!", src)
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!")
|
||||
|
||||
if(!(seed.icon_dead in states))
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!", src)
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!")
|
||||
|
||||
if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product
|
||||
if(!(seed.icon_harvest in states))
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!", src)
|
||||
log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!")
|
||||
|
||||
/obj/item/seeds/proc/randomize_stats()
|
||||
set_lifespan(rand(25, 60))
|
||||
|
||||
@@ -11,10 +11,8 @@
|
||||
return
|
||||
if("Q")
|
||||
if(!(client.prefs.toggles & AZERTY))
|
||||
uneq_active()
|
||||
return
|
||||
on_drop_hotkey_press() // User is in QWERTY hotkey mode.
|
||||
if("A")
|
||||
if(client.prefs.toggles & AZERTY)
|
||||
uneq_active()
|
||||
return
|
||||
on_drop_hotkey_press()
|
||||
return ..()
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_selected))
|
||||
var/armor_block = D.run_armor_check(affecting, "melee")
|
||||
|
||||
D.visible_message("<span class='danger'>[A] has hit [D] with invisible nuncucks!</span>", \
|
||||
"<span class='userdanger'>[A] has hit [D] with a with invisible nuncuck!</span>")
|
||||
D.visible_message("<span class='danger'>[A] has hit [D] with invisible nunchucks!</span>", \
|
||||
"<span class='userdanger'>[A] has hit [D] with a with invisible nunchuck!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
D.apply_damage(damage, STAMINA, affecting, armor_block)
|
||||
|
||||
@@ -109,7 +109,7 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
if(!alone_in_area(get_area(src), usr))
|
||||
to_chat(usr, "<span class='warning'>Prisoners are only allowed to be released while alone.</span>")
|
||||
else
|
||||
switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE))
|
||||
switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE, usr))
|
||||
if(1)
|
||||
to_chat(usr, "<span class='notice'>Shuttle not found.</span>")
|
||||
if(2)
|
||||
@@ -121,6 +121,7 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval."
|
||||
announcer.autosay(message, "Labor Camp Controller", "Security")
|
||||
to_chat(usr, "<span class='notice'>Shuttle received message and will be sent shortly.</span>")
|
||||
usr.create_log(MISC_LOG, "used [src] to call the laborcamp shuttle")
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/points = 0 //How many points this ore gets you from the ore redemption machine
|
||||
var/refined_type = null //What this ore defaults to being refined into
|
||||
|
||||
/obj/item/stack/ore/New()
|
||||
/obj/item/stack/ore/New(loc, new_amount, merge = TRUE)
|
||||
..()
|
||||
pixel_x = rand(0, 16) - 8
|
||||
pixel_y = rand(0, 8) - 8
|
||||
|
||||
@@ -117,7 +117,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
MA.blend_mode = COPY.blend_mode
|
||||
MA.color = COPY.color
|
||||
MA.dir = COPY.dir
|
||||
MA.gender = COPY.gender
|
||||
MA.icon = COPY.icon
|
||||
MA.icon_state = COPY.icon_state
|
||||
MA.layer = COPY.layer
|
||||
@@ -131,7 +130,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
if(!isicon(MA.icon) && !LAZYLEN(MA.overlays)) // Gibbing/dusting/melting removes the icon before ghostize()ing the mob, so we need to account for that
|
||||
MA.icon = initial(icon)
|
||||
MA.icon_state = initial(icon_state)
|
||||
MA.suffix = COPY.suffix
|
||||
MA.underlays = COPY.underlays
|
||||
|
||||
. = MA
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(speaker_name != speaker.real_name && speaker.real_name)
|
||||
speaker_name = "[speaker.real_name] ([speaker_name])"
|
||||
track = "([ghost_follow_link(speaker, ghost=src)]) "
|
||||
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
|
||||
if(client.prefs.toggles & CHAT_GHOSTEARS && (speaker in view(src)))
|
||||
message = "<b>[message]</b>"
|
||||
|
||||
if(!can_hear())
|
||||
|
||||
@@ -98,7 +98,9 @@
|
||||
if(!check_can_speak(speaker))
|
||||
return FALSE
|
||||
|
||||
log_say("([name]-HIVE) [message]", speaker)
|
||||
var/log_message = "([name]-HIVE) [message]"
|
||||
log_say(log_message, speaker)
|
||||
speaker.create_log(SAY_LOG, log_message)
|
||||
|
||||
if(!speaker_mask)
|
||||
speaker_mask = speaker.name
|
||||
@@ -605,7 +607,10 @@
|
||||
if(!message)
|
||||
return
|
||||
|
||||
log_say("(ROBOT) [message]", speaker)
|
||||
var/log_message = "(ROBOT) [message]"
|
||||
log_say(log_message, speaker)
|
||||
speaker.create_log(SAY_LOG, log_message)
|
||||
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i><span class='robot'>\"[message]\"</span></span></span>"
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
else //Maybe uses plasma in the future, although that wouldn't make any sense...
|
||||
leaping = 1
|
||||
update_icons()
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .leap_end))
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .proc/leap_end))
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
|
||||
leaping = 0
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "alien"
|
||||
icon_state = "alien_s"
|
||||
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 5, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
var/obj/item/r_store = null
|
||||
var/obj/item/l_store = null
|
||||
var/caste = ""
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
|
||||
if(lying > 0)
|
||||
lying = 90 //Anything else looks retarded
|
||||
lying = 90 //Anything else looks lousy
|
||||
..()
|
||||
update_icons()
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return Attach(AM)
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed)
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force)
|
||||
if(!..())
|
||||
return
|
||||
if(stat == CONSCIOUS)
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
if(imprinted_master)
|
||||
to_chat(H, "<span class='biggerdanger'>You are permanently imprinted to [imprinted_master], obey [imprinted_master]'s every order and assist [imprinted_master.p_them()] in completing [imprinted_master.p_their()] goals at any cost.</span>")
|
||||
|
||||
|
||||
/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate)
|
||||
searching = FALSE
|
||||
brainmob.key = candidate.key
|
||||
@@ -206,6 +205,10 @@
|
||||
brainmob.container = src
|
||||
brainmob.stat = CONSCIOUS
|
||||
brainmob.SetSilence(0)
|
||||
brainmob.dna = new(brainmob)
|
||||
brainmob.dna.species = new /datum/species/machine() // Else it will default to human. And we don't want to clone IRC humans now do we?
|
||||
brainmob.dna.ResetSE()
|
||||
brainmob.dna.ResetUI()
|
||||
GLOB.dead_mob_list -= brainmob
|
||||
..()
|
||||
|
||||
|
||||
@@ -432,13 +432,8 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
|
||||
if(!vent_found)
|
||||
for(var/obj/machinery/atmospherics/machine in range(1,src))
|
||||
if(is_type_in_list(machine, GLOB.ventcrawl_machinery))
|
||||
if(is_type_in_list(machine, GLOB.ventcrawl_machinery) && machine.can_crawl_through())
|
||||
vent_found = machine
|
||||
|
||||
if(!vent_found.can_crawl_through())
|
||||
vent_found = null
|
||||
|
||||
if(vent_found)
|
||||
break
|
||||
|
||||
if(vent_found)
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||
|
||||
if(amount > 0)
|
||||
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source, list(), FALSE, updating_health)
|
||||
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source, forbidden_limbs = list(), ignore_resists=FALSE, updating_health=updating_health)
|
||||
else
|
||||
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
|
||||
O.heal_damage(-amount, 0, internal = 0, robo_repair = O.is_robotic(), updating_health = updating_health)
|
||||
|
||||
@@ -23,7 +23,7 @@ GLOBAL_DATUM_INIT(default_martial_art, /datum/martial_art, new())
|
||||
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
|
||||
|
||||
//Equipment slots
|
||||
var/obj/item/w_uniform = null
|
||||
var/obj/item/clothing/under/w_uniform = null
|
||||
var/obj/item/shoes = null
|
||||
var/obj/item/belt = null
|
||||
var/obj/item/gloves = null
|
||||
|
||||
@@ -313,6 +313,11 @@
|
||||
/mob/living/carbon/human/put_in_hands(obj/item/I)
|
||||
if(!I)
|
||||
return FALSE
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
if(S.amount == 0)
|
||||
qdel(I)
|
||||
return FALSE
|
||||
if(put_in_active_hand(I))
|
||||
return TRUE
|
||||
else if(put_in_inactive_hand(I))
|
||||
|
||||
@@ -897,7 +897,7 @@
|
||||
|
||||
// Not on the station or mining?
|
||||
var/turf/temp_turf = get_turf(remoteview_target)
|
||||
if(!temp_turf in config.contact_levels)
|
||||
if(!(temp_turf in config.contact_levels))
|
||||
to_chat(src, "<span class='alert'>Your psy-connection grows too faint to maintain!</span>")
|
||||
isRemoteObserve = 0
|
||||
|
||||
@@ -1123,4 +1123,4 @@
|
||||
|
||||
// Need this in species.
|
||||
//#undef HUMAN_MAX_OXYLOSS
|
||||
//#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
//#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
|
||||
if(H.LAssailant && ishuman(H.LAssailant)) //superheros still get the comical hit markers
|
||||
var/mob/living/carbon/human/A = H.LAssailant
|
||||
if(A.mind && A.mind in (SSticker.mode.superheroes || SSticker.mode.supervillains || SSticker.mode.greyshirts))
|
||||
if(A.mind && (A.mind in (SSticker.mode.superheroes) || SSticker.mode.supervillains || SSticker.mode.greyshirts))
|
||||
var/list/attack_bubble_recipients = list()
|
||||
var/mob/living/user
|
||||
for(var/mob/O in viewers(user, src))
|
||||
@@ -963,7 +963,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
|
||||
|
||||
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
|
||||
|
||||
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
|
||||
/proc/get_random_species(species_name = FALSE) // Returns a random non black-listed or hazardous species, either as a string or datum
|
||||
var/static/list/random_species = list()
|
||||
|
||||
@@ -474,7 +474,7 @@
|
||||
if(P.is_reflectable)
|
||||
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [H]'s glass skin!</span>")
|
||||
|
||||
|
||||
P.reflect_back(H)
|
||||
|
||||
return FALSE
|
||||
@@ -534,7 +534,7 @@
|
||||
if(world.time > last_teleport + teleport_cooldown && M != H && M.a_intent != INTENT_HELP)
|
||||
reactive_teleport(H)
|
||||
|
||||
/datum/species/golem/bluespace/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/golem/bluespace/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_teleport + teleport_cooldown && user != H)
|
||||
reactive_teleport(H)
|
||||
@@ -654,7 +654,7 @@
|
||||
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
|
||||
last_banana = world.time
|
||||
|
||||
/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_banana + banana_cooldown && user != H)
|
||||
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
is_small = 1
|
||||
has_fine_manipulation = 0
|
||||
ventcrawler = VENTCRAWLER_NUDE
|
||||
dietflags = DIET_OMNI
|
||||
show_ssd = 0
|
||||
eyes = "blank_eyes"
|
||||
death_message = "lets out a faint chimper as it collapses and stops moving..."
|
||||
|
||||
@@ -575,7 +575,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
bloodsies.color = w_uniform.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun:
|
||||
if(w_uniform.accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun:
|
||||
for(var/obj/item/clothing/accessory/A in w_uniform:accessories)
|
||||
var/tie_color = A.item_color
|
||||
if(!tie_color)
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
update_canmove()
|
||||
|
||||
timeofdeath = world.time
|
||||
create_log(ATTACK_LOG, "died[gibbed ? " (Gibbed)": ""]")
|
||||
|
||||
GLOB.living_mob_list -= src
|
||||
GLOB.dead_mob_list += src
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
prepare_data_huds()
|
||||
|
||||
/mob/living/proc/prepare_data_huds()
|
||||
..()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
|
||||
|
||||
@@ -177,6 +177,12 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(handle_message_mode(message_mode, message_pieces, verb, used_radios))
|
||||
return 1
|
||||
|
||||
// Log of what we've said, plain message, no spans or junk
|
||||
// handle_message_mode should have logged this already if it handled it
|
||||
var/log_message = "[message_mode ? "([message_mode])" : ""] '[message]'"
|
||||
say_log += log_message
|
||||
create_log(SAY_LOG, log_message) // TODO after #13047: Include the channel
|
||||
log_say(log_message, src)
|
||||
|
||||
var/list/handle_v = handle_speech_sound()
|
||||
var/sound/speech_sound = handle_v[1]
|
||||
@@ -274,10 +280,6 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(O) //It's possible that it could be deleted in the meantime.
|
||||
O.hear_talk(src, message_pieces, verb)
|
||||
|
||||
//Log of what we've said, plain message, no spans or junk
|
||||
say_log += message
|
||||
create_log(SAY_LOG, message) // TODO after #13047: Include the channel
|
||||
log_say(message, src)
|
||||
return 1
|
||||
|
||||
/obj/effect/speech_bubble
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
if(radio)
|
||||
radio.wires.CutWireIndex(RADIO_WIRE_TRANSMIT)
|
||||
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Engineering")
|
||||
|
||||
//They are unable to be upgraded, so let's give them a bit of a better battery.
|
||||
|
||||
@@ -30,29 +30,22 @@
|
||||
/obj/item/circuitboard,
|
||||
/obj/item/stack/tile/light,
|
||||
/obj/item/stack/ore/bluespace_crystal
|
||||
)
|
||||
)
|
||||
|
||||
//Item currently being held.
|
||||
var/obj/item/wrapped = null
|
||||
|
||||
/obj/item/gripper/paperwork
|
||||
name = "paperwork gripper"
|
||||
desc = "A simple grasping tool for clerical work."
|
||||
|
||||
can_hold = list(
|
||||
/obj/item/clipboard,
|
||||
/obj/item/paper,
|
||||
/obj/item/card/id
|
||||
)
|
||||
var/obj/item/gripped_item = null
|
||||
|
||||
/obj/item/gripper/medical
|
||||
name = "medical gripper"
|
||||
desc = "A grasping tool used to help patients up once surgery is complete."
|
||||
can_hold = list()
|
||||
|
||||
/obj/item/gripper/medical/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
|
||||
/obj/item/gripper/medical/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/gripper/medical/afterattack(atom/target, mob/living/user, proximity, params)
|
||||
var/mob/living/carbon/human/H
|
||||
if(!wrapped && proximity && target && ishuman(target))
|
||||
if(!gripped_item && proximity && target && ishuman(target))
|
||||
H = target
|
||||
if(H.lying)
|
||||
H.AdjustSleeping(-5)
|
||||
@@ -71,98 +64,69 @@
|
||||
..()
|
||||
can_hold = typecacheof(can_hold)
|
||||
|
||||
/obj/item/gripper/attack_self(mob/user as mob)
|
||||
if(wrapped)
|
||||
wrapped.attack_self(user)
|
||||
|
||||
/obj/item/gripper/verb/drop_item()
|
||||
|
||||
set name = "Drop Gripped Item"
|
||||
set desc = "Release an item from your magnetic gripper."
|
||||
set category = "Drone"
|
||||
|
||||
drop_item_p()
|
||||
drop_gripped_item()
|
||||
|
||||
// The "p" stands for proc, since I was having annoying weird stuff happening with this in the verb
|
||||
// when trying to have default values for arguments and stuff
|
||||
/obj/item/gripper/proc/drop_item_p(var/silent = 0)
|
||||
/obj/item/gripper/attack_self(mob/user)
|
||||
if(gripped_item)
|
||||
gripped_item.attack_self(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is empty.</span>")
|
||||
|
||||
if(!wrapped)
|
||||
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
|
||||
for(var/obj/item/thing in src.contents)
|
||||
thing.forceMove(get_turf(src))
|
||||
return
|
||||
/obj/item/gripper/proc/drop_gripped_item(silent = FALSE)
|
||||
if(gripped_item)
|
||||
if(!silent)
|
||||
to_chat(loc, "<span class='warning'>You drop [gripped_item].</span>")
|
||||
gripped_item.forceMove(get_turf(src))
|
||||
gripped_item = null
|
||||
|
||||
if(wrapped.loc != src)
|
||||
wrapped = null
|
||||
return
|
||||
|
||||
if(!silent)
|
||||
to_chat(src.loc, "<span class='warning'>You drop \the [wrapped].</span>")
|
||||
wrapped.forceMove(get_turf(src))
|
||||
wrapped = null
|
||||
|
||||
/obj/item/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
/obj/item/gripper/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/item/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
|
||||
/// Grippers are snowflakey so this is needed to to prevent forceMoving grippers after `if(!user.drop_item())` checks done in certain attackby's.
|
||||
/obj/item/gripper/forceMove(atom/destination)
|
||||
return
|
||||
|
||||
/obj/item/gripper/afterattack(atom/target, mob/living/user, proximity, params)
|
||||
|
||||
if(!target || !proximity) //Target is invalid or we are not adjacent.
|
||||
return
|
||||
return FALSE
|
||||
|
||||
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
|
||||
if(!wrapped)
|
||||
for(var/obj/item/thing in src.contents)
|
||||
wrapped = thing
|
||||
break
|
||||
if(gripped_item) //Already have an item.
|
||||
|
||||
if(wrapped) //Already have an item.
|
||||
|
||||
//Temporary put wrapped into user so target's attackby() checks pass.
|
||||
wrapped.forceMove(user)
|
||||
|
||||
//Pass the attack on to the target. This might delete/relocate wrapped.
|
||||
if(!target.attackby(wrapped, user, params) && target && wrapped)
|
||||
// If the attackby didn't resolve or delete the target or wrapped, afterattack
|
||||
//Pass the attack on to the target. This might delete/relocate gripped_item.
|
||||
if(!target.attackby(gripped_item, user, params))
|
||||
// If the attackby didn't resolve or delete the target or gripped_item, afterattack
|
||||
// (Certain things, such as mountable frames, rely on afterattack)
|
||||
wrapped.afterattack(target, user, 1, params)
|
||||
gripped_item?.afterattack(target, user, 1, params)
|
||||
|
||||
//If wrapped did neither get deleted nor put into target, put it back into the gripper.
|
||||
if(wrapped && user && (wrapped.loc == user))
|
||||
wrapped.forceMove(src)
|
||||
else
|
||||
wrapped = null
|
||||
return
|
||||
|
||||
else if(istype(target,/obj/item)) //Check that we're not pocketing a mob.
|
||||
|
||||
//...and that the item is not in a container.
|
||||
if(!isturf(target.loc))
|
||||
return
|
||||
//If gripped_item either didn't get deleted, or it failed to be transfered to its target
|
||||
if(!gripped_item && contents.len)
|
||||
gripped_item = contents[1]
|
||||
return FALSE
|
||||
else if(gripped_item && !contents.len)
|
||||
gripped_item = null
|
||||
|
||||
else if(istype(target, /obj/item)) //Check that we're not pocketing a mob.
|
||||
var/obj/item/I = target
|
||||
|
||||
//Check if the item is blacklisted.
|
||||
var/grab = 0
|
||||
if(can_hold.len)
|
||||
if(is_type_in_typecache(I, can_hold))
|
||||
grab = 1
|
||||
|
||||
//We can grab the item, finally.
|
||||
if(grab)
|
||||
to_chat(user, "You collect \the [I].")
|
||||
if(is_type_in_typecache(I, can_hold)) // Make sure the item is something the gripper can hold
|
||||
to_chat(user, "<span class='notice'>You collect [I].</span>")
|
||||
I.forceMove(src)
|
||||
wrapped = I
|
||||
return
|
||||
gripped_item = I
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Your gripper cannot hold \the [target].</span>")
|
||||
to_chat(user, "<span class='warning'>Your gripper cannot hold [target].</span>")
|
||||
return FALSE
|
||||
|
||||
else if(istype(target,/obj/machinery/power/apc))
|
||||
var/obj/machinery/power/apc/A = target
|
||||
if(A.opened)
|
||||
if(A.cell)
|
||||
|
||||
wrapped = A.cell
|
||||
gripped_item = A.cell
|
||||
|
||||
A.cell.add_fingerprint(user)
|
||||
A.cell.update_icon()
|
||||
@@ -173,6 +137,7 @@
|
||||
A.update_icon()
|
||||
|
||||
user.visible_message("<span class='warning'>[user] removes the power cell from [A]!</span>", "You remove the power cell.")
|
||||
return TRUE
|
||||
|
||||
//TODO: Matter decompiler.
|
||||
/obj/item/matter_decompiler
|
||||
|
||||
@@ -115,11 +115,11 @@
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/robot/drop_item()
|
||||
var/obj/item/I = get_active_hand()
|
||||
if(istype(I, /obj/item/gripper))
|
||||
var/obj/item/gripper/G = I
|
||||
G.drop_item_p(silent = 1)
|
||||
return
|
||||
var/obj/item/gripper/G = get_active_hand()
|
||||
if(istype(G))
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
return TRUE // The gripper is special because it has a normal item inside that we can drop.
|
||||
return FALSE // All robot inventory items have NODROP, so they should return FALSE.
|
||||
|
||||
//Helper procs for cyborg modules on the UI.
|
||||
//These are hackish but they help clean up code elsewhere.
|
||||
|
||||
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Miner")
|
||||
module = new /obj/item/robot_module/miner(src)
|
||||
module.channels = list("Supply" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Mining Outpost")
|
||||
module_sprites["Basic"] = "Miner_old"
|
||||
module_sprites["Advanced Droid"] = "droid-miner"
|
||||
@@ -340,7 +340,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Medical")
|
||||
module = new /obj/item/robot_module/medical(src)
|
||||
module.channels = list("Medical" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Medical")
|
||||
module_sprites["Basic"] = "Medbot"
|
||||
module_sprites["Surgeon"] = "surgeon"
|
||||
@@ -366,7 +366,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Engineering")
|
||||
module = new /obj/item/robot_module/engineering(src)
|
||||
module.channels = list("Engineering" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Engineering")
|
||||
module_sprites["Basic"] = "Engineering"
|
||||
module_sprites["Antique"] = "engineerrobot"
|
||||
@@ -1472,3 +1472,12 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
|
||||
sync_lighting_plane_alpha()
|
||||
|
||||
/// Used in `robot_bindings.dm` when the user presses "A" if on AZERTY mode, or "Q" on QWERTY mode.
|
||||
/mob/living/silicon/robot/proc/on_drop_hotkey_press()
|
||||
var/obj/item/gripper/G = get_active_hand()
|
||||
if(istype(G) && G.gripped_item)
|
||||
G.drop_gripped_item() // if the active module is a gripper, try to drop its held item.
|
||||
else
|
||||
uneq_active() // else unequip the module and put it back into the robot's inventory.
|
||||
return
|
||||
|
||||
@@ -230,7 +230,7 @@
|
||||
/obj/item/robot_module/engineering/handle_death()
|
||||
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
|
||||
if(G)
|
||||
G.drop_item()
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
|
||||
/obj/item/robot_module/security
|
||||
name = "security robot module"
|
||||
@@ -578,7 +578,7 @@
|
||||
/obj/item/robot_module/drone/handle_death()
|
||||
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
|
||||
if(G)
|
||||
G.drop_item()
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
|
||||
//checks whether this item is a module of the robot it is located in.
|
||||
/obj/item/proc/is_robot_module()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
speed = 0
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 3, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 3, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
harm_intent_damage = 5
|
||||
@@ -83,7 +83,7 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
move_to_delay = 4
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 4, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 4, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
projectiletype = /obj/item/projectile/neurotox
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
status_flags = 0
|
||||
@@ -130,7 +130,7 @@
|
||||
move_to_delay = 4
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 10, /obj/item/stack/sheet/animalhide/xeno = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 10, /obj/item/stack/sheet/animalhide/xeno = 2)
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/bearmeat = 5, /obj/item/clothing/head/bearpelt = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/bearmeat= 5, /obj/item/clothing/head/bearpelt = 1)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
|
||||
@@ -74,12 +74,11 @@
|
||||
else
|
||||
our_color = pick(carp_colors)
|
||||
add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY)
|
||||
add_carp_overlay()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay()
|
||||
if(!random_color)
|
||||
return
|
||||
cut_overlays()
|
||||
var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth")
|
||||
base_overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(base_overlay)
|
||||
@@ -87,7 +86,6 @@
|
||||
/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay()
|
||||
if(!random_color)
|
||||
return
|
||||
cut_overlays()
|
||||
var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth")
|
||||
base_dead_overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(base_dead_overlay)
|
||||
@@ -103,24 +101,22 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/death(gibbed)
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
if(!random_color || gibbed)
|
||||
return
|
||||
add_dead_carp_overlay()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/revive()
|
||||
..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
if(!random_color)
|
||||
return
|
||||
if(stat != DEAD)
|
||||
add_carp_overlay()
|
||||
else
|
||||
add_dead_carp_overlay()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/holocarp
|
||||
icon_state = "holocarp"
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
|
||||
if(prob(6))
|
||||
for(var/turf/simulated/floor/O in range(src, 6))
|
||||
O.MakeSlippery(TURF_WET_WATER, 10)
|
||||
O.MakeSlippery(TURF_WET_WATER, 10 SECONDS)
|
||||
playsound(src, 'sound/effects/clownstep1.ogg', 30, 1)
|
||||
|
||||
if(prob(5))
|
||||
@@ -323,7 +323,7 @@
|
||||
if(!eating)
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Grab, H), 70)
|
||||
for(var/turf/simulated/floor/O in range(src, 6))
|
||||
O.MakeSlippery(TURF_WET_LUBE, 20)
|
||||
O.MakeSlippery(TURF_WET_LUBE, 20 SECONDS)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
|
||||
|
||||
eating = TRUE
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
turns_per_move = 5
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat= 2, /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg= 8)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
@@ -53,7 +53,7 @@
|
||||
icon_state = "nurse"
|
||||
icon_living = "nurse"
|
||||
icon_dead = "nurse_dead"
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8, /obj/item/reagent_containers/food/snacks/spidereggs = 4)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat= 2, /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg= 8, /obj/item/reagent_containers/food/snacks/monstermeat/spidereggs= 4)
|
||||
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
else
|
||||
devour(L)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/onShuttleMove()
|
||||
/mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/oldT, turf/T1, rotation, mob/caller)
|
||||
var/turf/oldloc = loc
|
||||
. = ..()
|
||||
if(!.)
|
||||
@@ -100,7 +100,7 @@
|
||||
message_admins("Megafauna [src] \
|
||||
([ADMIN_FLW(src,"FLW")]) \
|
||||
moved via shuttle from ([oldloc.x], [oldloc.y], [oldloc.z]) to \
|
||||
([newloc.x], [newloc.y], [newloc.z])")
|
||||
([newloc.x], [newloc.y], [newloc.z])[caller ? " called by [ADMIN_LOOKUP(caller)]" : ""]")
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L)
|
||||
if(!L)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
throw_message = "does nothing to the tough hide of the"
|
||||
pre_attack_icon = "goliath2"
|
||||
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
loot = list()
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = TRUE
|
||||
@@ -113,7 +113,7 @@
|
||||
pre_attack_icon = "Goliath_preattack"
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/bone = 2)
|
||||
crusher_drop_mod = 30
|
||||
wander = FALSE
|
||||
var/list/cached_tentacle_turfs
|
||||
|
||||
@@ -50,10 +50,9 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
if(udder.reagents.total_volume == udder.reagents.maximum_volume)
|
||||
add_overlay("gl_full")
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass))
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
if(L == user)
|
||||
continue
|
||||
var/turf/T = get_turf(L.loc)
|
||||
if(T && T in targets)
|
||||
if(T && (T in targets))
|
||||
L.EyeBlind(4)
|
||||
return
|
||||
|
||||
|
||||
@@ -374,11 +374,11 @@
|
||||
return
|
||||
return
|
||||
|
||||
if(parrot_interest && parrot_interest in view(src))
|
||||
if(parrot_interest && (parrot_interest in view(src)))
|
||||
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
||||
return
|
||||
|
||||
if(parrot_perch && parrot_perch in view(src))
|
||||
if(parrot_perch && (parrot_perch in view(src)))
|
||||
parrot_state = PARROT_SWOOP | PARROT_RETURN
|
||||
return
|
||||
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
real_name = P.tagname
|
||||
|
||||
/mob/living/simple_animal/regenerate_icons()
|
||||
cut_overlays()
|
||||
if(pcollar && collar_type)
|
||||
cut_overlays()
|
||||
add_overlay("[collar_type]collar")
|
||||
add_overlay("[collar_type]tag")
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
set_colour(pick(slime_colours))
|
||||
|
||||
/mob/living/simple_animal/slime/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
|
||||
icon_dead = "[icon_text] dead"
|
||||
if(stat != DEAD)
|
||||
@@ -130,7 +130,6 @@
|
||||
add_overlay("aslime-[mood]")
|
||||
else
|
||||
icon_state = icon_dead
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/slime/movement_delay()
|
||||
if(bodytemperature >= 330.23) // 135 F or 57.08 C
|
||||
@@ -262,7 +261,7 @@
|
||||
Feedon(Food)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/slime/unEquip(obj/item/I)
|
||||
/mob/living/simple_animal/slime/unEquip(obj/item/I, force)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
|
||||
@@ -60,7 +60,6 @@ GLOBAL_VAR_INIT(totaltribbles, 0) //global variable so it updates for all trib
|
||||
|
||||
|
||||
/mob/living/simple_animal/tribble/proc/procreate()
|
||||
..()
|
||||
if(GLOB.totaltribbles <= maxtribbles)
|
||||
for(var/mob/living/simple_animal/tribble/F in src.loc)
|
||||
if(!F || F == src)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
else if(stat == UNCONSCIOUS)
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Fallen unconscious at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Fallen unconscious")
|
||||
add_attack_logs(src, null, "Fallen unconscious", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] fell unconscious at [atom_loc_line(get_turf(src))]")
|
||||
stat = UNCONSCIOUS
|
||||
if(updating)
|
||||
@@ -23,7 +23,7 @@
|
||||
else if(stat == CONSCIOUS)
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Woken up at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Woken up")
|
||||
add_attack_logs(src, null, "Woken up", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] woke up at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
if(updating)
|
||||
@@ -47,7 +47,7 @@
|
||||
if(!can_be_revived())
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Came back to life at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Came back to life")
|
||||
add_attack_logs(src, null, "Came back to life", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] came back to life at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
GLOB.dead_mob_list -= src
|
||||
@@ -76,4 +76,4 @@
|
||||
return 1
|
||||
|
||||
/mob/living/proc/check_death_method()
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
if(GLOB.summon_magic_triggered)
|
||||
give_magic(character)
|
||||
|
||||
if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs)
|
||||
if(!thisjob.is_position_available() && (thisjob in SSjobs.prioritized_jobs))
|
||||
SSjobs.prioritized_jobs -= thisjob
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
|
||||
// Show expired polls. Non admins can view admin polls at this stage
|
||||
// (just like tgstation's web interface so don't complain)
|
||||
// (Also why was there no ingame interface tg not having an ingame
|
||||
// interface is retarded because it cucks downstreams)
|
||||
// (Also why was there no ingame interface? tg not having an ingame
|
||||
// interface is a pain in the neck because it means downstreams have to roll their own)
|
||||
select_query = GLOB.dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE Now() > endtime ORDER BY id DESC")
|
||||
select_query.Execute()
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
name = "Emo"
|
||||
icon_state = "emo"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
/datum/sprite_accessory/hair/flow
|
||||
name = "Flow Hair"
|
||||
icon_state = "flow"
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
if(monitored_alarm_ids)
|
||||
for(var/obj/machinery/alarm/alarm in GLOB.machines)
|
||||
if(alarm.alarm_id && alarm.alarm_id in monitored_alarm_ids)
|
||||
if(alarm.alarm_id && (alarm.alarm_id in monitored_alarm_ids))
|
||||
monitored_alarms += alarm
|
||||
// machines may not yet be ordered at this point
|
||||
monitored_alarms = dd_sortedObjectList(monitored_alarms)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
/datum/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = GLOB.default_state)
|
||||
/datum/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nanoui/master_ui = null, var/datum/topic_state/state = GLOB.default_state)
|
||||
return
|
||||
|
||||
/**
|
||||
|
||||
@@ -135,7 +135,6 @@
|
||||
P.name = "paper - '[G.fields["name"]]'"
|
||||
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
|
||||
//before the records have been generated, so we do this inside the loop.
|
||||
..()
|
||||
|
||||
/obj/structure/filingcabinet/security/attack_hand()
|
||||
populate()
|
||||
@@ -169,7 +168,6 @@
|
||||
P.name = "paper - '[G.fields["name"]]'"
|
||||
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
|
||||
//before the records have been generated, so we do this inside the loop.
|
||||
..()
|
||||
|
||||
/obj/structure/filingcabinet/medical/attack_hand()
|
||||
populate()
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
#define APC_WIRE_IDSCAN 1
|
||||
#define APC_WIRE_MAIN_POWER1 2
|
||||
#define APC_WIRE_MAIN_POWER2 3
|
||||
#define APC_WIRE_AI_CONTROL 4
|
||||
|
||||
//update_state
|
||||
#define UPSTATE_CELL_IN 1
|
||||
#define UPSTATE_OPENED1 2
|
||||
@@ -430,11 +425,11 @@
|
||||
if(stat & (NOPOWER | BROKEN))
|
||||
return
|
||||
if(!second_pass) //The first time, we just cut overlays
|
||||
addtimer(CALLBACK(src, .get_spooked, TRUE), 1)
|
||||
addtimer(CALLBACK(src, /obj/machinery/power/apc/proc.get_spooked, TRUE), 1)
|
||||
cut_overlays()
|
||||
else
|
||||
flick("apcemag", src) //Second time we cause the APC to update its icon, then add a timer to update icon later
|
||||
addtimer(CALLBACK(src, .proc/update_icon, TRUE), 10)
|
||||
addtimer(CALLBACK(src, /obj/machinery/power/apc/proc.update_icon, TRUE), 10)
|
||||
|
||||
//attack with an item - open/close cover, insert cell, or (un)lock interface
|
||||
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
|
||||
|
||||
@@ -285,13 +285,15 @@
|
||||
autostart = 1 // Automatically start
|
||||
|
||||
/obj/machinery/power/solar_control/Initialize()
|
||||
..()
|
||||
if(!powernet)
|
||||
return
|
||||
SSsun.solars |= src
|
||||
setup()
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/power/solar_control/proc/setup()
|
||||
connect_to_network()
|
||||
set_panels(cdir)
|
||||
if(autostart)
|
||||
src.search_for_connected()
|
||||
search_for_connected()
|
||||
if(connected_tracker && track == 2)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user