Merge branch 'master' into botFixes

This commit is contained in:
Kelenius
2016-03-01 14:48:24 +03:00
435 changed files with 7227 additions and 12036 deletions

View File

@@ -1315,7 +1315,7 @@ proc/admin_notice(var/message, var/rights)
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins))
if (!istype(src,/datum/admins) || !check_rights(R_ADMIN))
usr << "Error: you are not an admin!"
return
@@ -1323,19 +1323,33 @@ proc/admin_notice(var/message, var/rights)
usr << "Mode has not started."
return
message_admins("[key_name(usr)] attempting to force mode latespawn.")
ticker.mode.next_spawn = 0
log_and_message_admins("attempting to force mode autospawn.")
ticker.mode.try_latespawn()
/datum/admins/proc/paralyze_mob(mob/living/H as mob)
set category = "Admin"
set name = "Toggle Paralyze"
set desc = "Paralyzes a player. Or unparalyses them."
var/msg
if(check_rights(R_ADMIN|R_MOD))
if (H.paralysis == 0)
H.paralysis = 8000
msg = "has paralyzed [key_name(H)]."
else
H.paralysis = 0
msg = "has unparalyzed [key_name(H)]."
log_and_message_admins(msg)
/datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob)
set category = "Debug"
set name = "Set Telecrystals"
set desc = "Allows admins to change telecrystals of a user."
var/crystals
if(check_rights(R_ADMIN))
crystals = input("Amount of telecrystals for [H.ckey]", crystals) as null|num
crystals = input("Amount of telecrystals for [H.ckey], currently [H.mind.tcrystals].", crystals) as null|num
if (!isnull(crystals))
H.mind.tcrystals = crystals
var/msg = "[key_name(usr)] has modified [H.ckey]'s telecrystals to [crystals]."
@@ -1343,18 +1357,19 @@ proc/admin_notice(var/message, var/rights)
else
usr << "You do not have access to this command."
/datum/admins/proc/paralyze_mob(mob/living/H as mob)
set category = "Admin"
set name = "Toggle Paralyze"
set desc = "Paralyzes a player. Or unparalyses them."
var/msg
if(check_rights(R_ADMIN|R_MOD))
if (H.paralysis == 0)
H.paralysis = 8000
msg = "[key_name(usr)] has paralyzed [key_name(H)]."
else
H.paralysis = 0
msg = "[key_name(usr)] has unparalyzed [key_name(H)]."
message_admins(msg)
/datum/admins/proc/add_tcrystals(mob/living/carbon/human/H as mob)
set category = "Debug"
set name = "Add Telecrystals"
set desc = "Allows admins to change telecrystals of a user by addition."
var/crystals
if(check_rights(R_ADMIN))
crystals = input("Amount of telecrystals to give to [H.ckey], currently [H.mind.tcrystals].", crystals) as null|num
if (!isnull(crystals))
H.mind.tcrystals += crystals
var/msg = "[key_name(usr)] has added [crystals] to [H.ckey]'s telecrystals."
message_admins(msg)
else
usr << "You do not have access to this command."

View File

@@ -15,6 +15,7 @@ var/list/admin_verbs_default = list(
var/list/admin_verbs_admin = list(
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/datum/admins/proc/set_tcrystals,
/datum/admins/proc/add_tcrystals,
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
/datum/admins/proc/show_game_mode, /*Configuration window for the current game mode.*/
@@ -132,9 +133,6 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
/client/proc/respawn_character,
/client/proc/FireLaser,
/client/proc/FireCannons,
/client/proc/ChangeIcarusPosition,
/client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge
)
@@ -605,22 +603,6 @@ var/list/admin_verbs_mentor = list(
message_admins("\blue [ckey] creating an admin explosion at [epicenter.loc].")
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_disease(mob/T as mob in mob_list) // -- Giacom
set category = "Fun"
set name = "Give Disease (old)"
set desc = "Gives a (tg-style) Disease to a mob."
var/list/disease_names = list()
for(var/v in diseases)
// "/datum/disease/" 15 symbols ~Intercross
disease_names.Add(copytext("[v]", 16, 0))
var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in disease_names
if(!D) return
var/path = text2path("/datum/disease/[D]")
T.contract_disease(new path, 1)
feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1)
/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom
set category = "Fun"
set name = "Give Disease"

View File

@@ -1681,13 +1681,8 @@
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = src.admincaster_feed_channel.channel_name
newChannel.author = src.admincaster_signature
newChannel.locked = src.admincaster_feed_channel.locked
newChannel.is_admin_channel = 1
feedback_inc("newscaster_channels",1)
news_network.network_channels += newChannel //Adding channel to the global network
news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1)
feedback_inc("newscaster_channels",1) //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
src.admincaster_screen=5
src.access_news_network()

View File

@@ -296,3 +296,4 @@
if(pa.Find("right"))
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]")

View File

@@ -496,8 +496,6 @@
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/head/det(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store)
@@ -604,7 +602,6 @@
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)

View File

@@ -1,129 +0,0 @@
/client/proc/FireLaser()
set name = "Fire the Icarus lasers"
set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost"
set category = "Fun"
var/turf/target = get_turf(src.mob)
log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireLaser(target)
/client/proc/FireCannons()
set name = "Fire the Icarus cannons"
set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost."
set category = "Fun"
var/turf/target = get_turf(src.mob)
log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireCannon(target)
/client/proc/ChangeIcarusPosition()
set name = "Adjust Icarus Position"
set desc = "Lets you chose the position of the Icarus in regards to the map."
set category = "Fun"
log_and_message_admins("is changing the Icarus position.")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_SetPosition(src)
var/icarus_position = SOUTH
proc/Icarus_FireLaser(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// should step down as:
// 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90
var/damage = 1000
for(var/i in 2 to 12)
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 1
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.damage = damage
in_chamber.kill_count = 500
in_chamber.process()
damage -= damage / i
sleep(-1)
// Let everyone know what hit them.
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 0
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.kill_count = 500
in_chamber.damage = 0
in_chamber.name = "point defense laser"
in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message.
in_chamber.process()
proc/Icarus_FireCannon(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// Now we find the corresponding turf on the other side of the level.
// Yeah, yeah. Overuse of the terinary operator. So sue me.
x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x
y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y
x_off = x != target.x ? abs(target.x - x) : INFINITY
y_off = y != target.y ? abs(target.y - y) : INFINITY
iterations = round(min(x_off, y_off))
x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0)
y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0)
target = locate(x, y, target.z)
// Finally fire the fucker.
var/obj/effect/meteor/projectile = new (start)
projectile.dest = target
projectile.name = "main gun projectile" // stealthy
projectile.hits = 6
// Make sure it travels
spawn(0)
walk_towards(projectile, projectile.dest, 1)
proc/Icarus_SetPosition(var/user)
var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9)
var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions
if(!direction)
return
icarus_position = directions[direction]

View File

@@ -520,7 +520,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "'[command_name()] Update.'"
P.info = input
P.info = replacetext(input, "\n", "<br/>")
P.update_space(P.info)
P.update_icon()
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
@@ -627,7 +628,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if(istype(M, /mob/dead/observer))
gibs(M.loc, M.viruses)
gibs(M.loc)
return
M.gib()

View File

@@ -74,17 +74,6 @@
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease"])
if(!check_rights(R_ADMIN|R_FUN)) return
var/mob/M = locate(href_list["give_disease"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease2"])
if(!check_rights(R_ADMIN|R_FUN)) return

View File

@@ -137,6 +137,11 @@
interact(mob/user as mob)
return //HTML MENU FOR WIRES GOES HERE
/obj/item/device/assembly/nano_host()
if(istype(loc, /obj/item/device/assembly_holder))
return loc.nano_host()
return ..()
/*
var/small_icon_state = null//If this obj will go inside the assembly use this for icons
var/list/small_icon_state_overlays = null//Same here

View File

@@ -2,8 +2,8 @@
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
origin_tech = list(TECH_COMBAT = 1)
matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
origin_tech = list(TECH_COMBAT = 1)
matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
var/armed = 0
@@ -54,7 +54,7 @@
if(!armed)
user << "<span class='notice'>You arm [src].</span>"
else
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
if((CLUMSY in user.mutations) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
@@ -70,7 +70,7 @@
attack_hand(mob/living/user as mob)
if(armed)
if(((user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
if((CLUMSY in user.mutations) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"

View File

@@ -158,6 +158,7 @@
spawn(5) // And wait a half-second, since it sounds like you can do this too fast.
if(src)
winset(src, null, "command=\".configure graphics-hwmode off\"")
sleep(2) // wait a bit more, possibly fixes hardware mode not re-activating right
winset(src, null, "command=\".configure graphics-hwmode on\"")
log_client_to_db()
@@ -280,6 +281,9 @@
if(inactivity > duration) return inactivity
return 0
/client/proc/last_activity_seconds()
return inactivity / 10
//send resources to the client. It's here in its own proc so we can move it around easiliy if need be
/client/proc/send_resources()

View File

@@ -20,7 +20,9 @@
S["OOC_Notes"] << pref.metadata
/datum/category_item/player_setup_item/general/basic/sanitize_character()
pref.age = sanitize_integer(pref.age, AGE_MIN, AGE_MAX, initial(pref.age))
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species]
pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name)
@@ -65,9 +67,11 @@
return TOPIC_REFRESH
else if(href_list["age"])
var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference", pref.age) as num|null
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species]
var/new_age = input(user, "Choose your character's age:\n([S.min_age]-[S.max_age])", "Character Preference", pref.age) as num|null
if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), AGE_MAX), AGE_MIN)
pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age)
return TOPIC_REFRESH
else if(href_list["spawnpoint"])

View File

@@ -135,7 +135,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
R = all_robolimbs[pref.rlimb_data[name]]
else
R = basic_robolimb
. += "\t[R.company] [organ_name] prothesis"
. += "\t[R.company] [organ_name] prosthesis"
else if(status == "amputated")
++ind
if(ind > 1)
@@ -264,6 +264,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.s_tone = 0
reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case.
var/datum/species/S = all_species[pref.species]
pref.age = max(min(pref.age, S.max_age), S.min_age)
return TOPIC_REFRESH
else if(href_list["hair_color"])
@@ -370,7 +374,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/third_limb = null // if you try to unchange the hand, the arm should also change
// Do not let them amputate their entire body, ty.
var/list/choice_options = list("Normal","Amputated","Prothesis")
var/list/choice_options = list("Normal","Amputated","Prosthesis")
switch(organ_tag)
if("Left Leg")
limb = BP_L_LEG
@@ -398,11 +402,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
third_limb = BP_R_ARM
if("Head")
limb = BP_HEAD
choice_options = list("Prothesis")
choice_options = list("Prosthesis")
if("Full Body")
limb = BP_TORSO
third_limb = BP_GROIN
choice_options = list("Normal","Prothesis")
choice_options = list("Normal","Prosthesis")
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in choice_options
if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
@@ -429,7 +433,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.organ_data[second_limb] = "amputated"
pref.rlimb_data[second_limb] = null
if("Prothesis")
if("Prosthesis")
var/tmp_species = pref.species ? pref.species : "Human"
var/list/usable_manufacturers = list()
for(var/company in chargen_robolimbs)

View File

@@ -1,5 +1,5 @@
/datum/category_item/player_setup_item/general/equipment
name = "Equipment"
name = "Clothing"
sort_order = 4
/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S)
@@ -8,7 +8,6 @@
S["socks"] >> pref.socks
S["backbag"] >> pref.backbag
S["pdachoice"] >> pref.pdachoice
S["gear"] >> pref.gear
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["underwear"] << pref.underwear
@@ -16,7 +15,6 @@
S["socks"] << pref.socks
S["backbag"] << pref.backbag
S["pdachoice"] << pref.pdachoice
S["gear"] << pref.gear
/datum/category_item/player_setup_item/general/equipment/sanitize_character()
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
@@ -32,61 +30,17 @@
if(!get_key_by_value(socks_t, pref.socks))
pref.socks = socks_t[1]
var/total_cost = 0
for(var/gear_name in pref.gear)
if(!gear_datums[gear_name])
pref.gear -= gear_name
else if(!(gear_name in valid_gear_choices()))
pref.gear -= gear_name
else
var/datum/gear/G = gear_datums[gear_name]
if(total_cost + G.cost > MAX_GEAR_COST)
pref.gear -= gear_name
else
total_cost += G.cost
/datum/category_item/player_setup_item/general/equipment/content()
. += "<b>Equipment Loadout:</b><br>"
. += "<b>Equipment:</b><br>"
. += "Underwear: <a href='?src=\ref[src];change_underwear=1'><b>[get_key_by_value(get_undies(),pref.underwear)]</b></a><br>"
. += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>"
. += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(socks_t,pref.socks)]</b></a><br>"
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
. += "PDA Type: <a href='?src=\ref[src];change_pda=1'><b>[pdachoicelist[pref.pdachoice]]</b></a><br>"
. += "<br><b>Custom Loadout:</b><br>"
var/total_cost = 0
if(pref.gear && pref.gear.len)
for(var/i = 1; i <= pref.gear.len; i++)
var/datum/gear/G = gear_datums[pref.gear[i]]
if(G)
total_cost += G.cost
. += "[pref.gear[i]] ([G.cost] points) <a href='?src=\ref[src];remove_loadout=[i]'>Remove</a><br>"
. += "<b>Used:</b> [total_cost] points."
else
. += "None."
if(total_cost < MAX_GEAR_COST)
. += " <a href='?src=\ref[src];add_loadout=1'>Add</a>"
if(pref.gear && pref.gear.len)
. += " <a href='?src=\ref[src];clear_loadout=1'>Clear</a>"
. += "<br>"
/datum/category_item/player_setup_item/general/equipment/proc/get_undies()
return pref.gender == MALE ? underwear_m : underwear_f
/datum/category_item/player_setup_item/general/equipment/proc/valid_gear_choices(var/max_cost)
var/list/valid_gear_choices = list()
for(var/gear_name in gear_datums)
var/datum/gear/G = gear_datums[gear_name]
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), G.whitelisted))
continue
if(max_cost && G.cost > max_cost)
continue
valid_gear_choices += gear_name
return valid_gear_choices
/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["change_underwear"])
var/underwear_options = get_undies()
@@ -118,33 +72,4 @@
if(!isnull(new_pdachoice) && CanUseTopic(user))
pref.pdachoice = pdachoicelist.Find(new_pdachoice)
return TOPIC_REFRESH
else if(href_list["add_loadout"])
var/total_cost = 0
for(var/gear_name in pref.gear)
if(gear_datums[gear_name])
var/datum/gear/G = gear_datums[gear_name]
total_cost += G.cost
var/choice = input(user, "Select gear to add:", "Character Preference") as null|anything in valid_gear_choices(MAX_GEAR_COST - total_cost)
if(choice && gear_datums[choice] && CanUseTopic(user))
var/datum/gear/C = gear_datums[choice]
total_cost += C.cost
if(C && total_cost <= MAX_GEAR_COST)
pref.gear += choice
user << "<span class='notice'>Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining).</span>"
else
user << "<span class='warning'>Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points.</span>"
return TOPIC_REFRESH
else if(href_list["remove_loadout"])
var/i_remove = text2num(href_list["remove_loadout"])
if(i_remove < 1 || i_remove > pref.gear.len) return TOPIC_NOACTION
pref.gear.Cut(i_remove, i_remove + 1)
return TOPIC_REFRESH
else if(href_list["clear_loadout"])
pref.gear.Cut()
return TOPIC_REFRESH
return ..()

View File

@@ -0,0 +1,161 @@
var/list/loadout_categories = list()
var/list/gear_datums = list()
/datum/loadout_category
var/category = ""
var/list/gear = list()
/datum/loadout_category/New(var/cat)
category = cat
..()
/hook/startup/proc/populate_gear_list()
//create a list of gear datums to sort
for(var/geartype in typesof(/datum/gear)-/datum/gear)
var/datum/gear/G = geartype
var/use_name = initial(G.display_name)
var/use_category = initial(G.sort_category)
if(!use_name)
error("Loadout - Missing display name: [G]")
continue
if(!initial(G.cost))
error("Loadout - Missing cost: [G]")
continue
if(!initial(G.path))
error("Loadout - Missing path definition: [G]")
continue
if(!loadout_categories[use_category])
loadout_categories[use_category] = new /datum/loadout_category(use_category)
var/datum/loadout_category/LC = loadout_categories[use_category]
gear_datums[use_name] = new geartype
LC.gear[use_name] = gear_datums[use_name]
loadout_categories = sortAssoc(loadout_categories)
for(var/loadout_category in loadout_categories)
var/datum/loadout_category/LC = loadout_categories[loadout_category]
LC.gear = sortAssoc(LC.gear)
return 1
/datum/category_item/player_setup_item/loadout
name = "Loadout"
sort_order = 1
var/current_tab = "General"
/datum/category_item/player_setup_item/loadout/load_character(var/savefile/S)
S["gear"] >> pref.gear
/datum/category_item/player_setup_item/loadout/save_character(var/savefile/S)
S["gear"] << pref.gear
/datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost)
var/list/valid_gear_choices = list()
for(var/gear_name in gear_datums)
var/datum/gear/G = gear_datums[gear_name]
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), G.whitelisted))
continue
if(max_cost && G.cost > max_cost)
continue
valid_gear_choices += gear_name
return valid_gear_choices
/datum/category_item/player_setup_item/loadout/sanitize_character()
for(var/gear_name in pref.gear)
if(!(gear_name in gear_datums))
pref.gear -= gear_name
var/total_cost = 0
for(var/gear_name in pref.gear)
if(!gear_datums[gear_name])
pref.gear -= gear_name
else if(!(gear_name in valid_gear_choices()))
pref.gear -= gear_name
else
var/datum/gear/G = gear_datums[gear_name]
if(total_cost + G.cost > MAX_GEAR_COST)
pref.gear -= gear_name
else
total_cost += G.cost
/datum/category_item/player_setup_item/loadout/content()
var/total_cost = 0
if(pref.gear && pref.gear.len)
for(var/i = 1; i <= pref.gear.len; i++)
var/datum/gear/G = gear_datums[pref.gear[i]]
if(G)
total_cost += G.cost
var/fcolor = "#3366CC"
if(total_cost < MAX_GEAR_COST)
fcolor = "#E67300"
. += "<table align = 'center' width = 500px>"
. += "<tr><td colspan=3><center><b><font color = '[fcolor]'>[total_cost]/[MAX_GEAR_COST]</font> loadout points spent.</b> \[<a href='?src=\ref[src];clear_loadout=1'>Clear Loadout</a>\]</center></td></tr>"
. += "<tr><td colspan=3><center><b>"
var/firstcat = 1
for(var/category in loadout_categories)
if(firstcat)
firstcat = 0
else
. += " |"
if(category == current_tab)
. += " [category] "
else
var/datum/loadout_category/LC = loadout_categories[category]
var/tcolor = "#3366CC"
for(var/thing in LC.gear)
if(thing in pref.gear)
tcolor = "#E67300"
break
. += " <a href='?src=\ref[src];select_category=[category]'><font color = '[tcolor]'>[category]</font></a> "
. += "</b></center></td></tr>"
var/datum/loadout_category/LC = loadout_categories[current_tab]
. += "<tr><td colspan=3><hr></td></tr>"
. += "<tr><td colspan=3><b><center>[LC.category]</center></b></td></tr>"
. += "<tr><td colspan=3><hr></td></tr>"
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
var/ticked = (G.display_name in pref.gear)
var/obj/item/temp = G.path
. += "<tr><td width=25%><a href='?src=\ref[src];toggle_gear=[G.display_name]'><font color='[ticked ? "#E67300" : "#3366CC"]'>[G.display_name]</font></a></td>"
. += "<td width = 10%>[G.cost]</td>"
. += "<td><font size=2><i>[initial(temp.desc)]</i></font></td></tr>"
. += "</table>"
/datum/category_item/player_setup_item/loadout/OnTopic(href, href_list, user)
if(href_list["toggle_gear"])
var/datum/gear/TG = gear_datums[href_list["toggle_gear"]]
if(TG.display_name in pref.gear)
pref.gear -= TG.display_name
else
var/total_cost = 0
for(var/gear_name in pref.gear)
var/datum/gear/G = gear_datums[gear_name]
if(istype(G)) total_cost += G.cost
if((total_cost+TG.cost) <= MAX_GEAR_COST)
pref.gear += TG.display_name
return TOPIC_REFRESH
else if(href_list["select_category"])
current_tab = href_list["select_category"]
return TOPIC_REFRESH
else if(href_list["clear_loadout"])
pref.gear.Cut()
return TOPIC_REFRESH
return ..()
/datum/gear
var/display_name //Name/index. Must be unique.
var/path //Path to item.
var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/whitelisted //Term to check the whitelist for..
var/sort_category = "General"

View File

@@ -0,0 +1,133 @@
/datum/gear/accessory
display_name = "armband, red"
path = /obj/item/clothing/accessory/armband
slot = slot_tie
sort_category = "Accessories"
/datum/gear/accessory/cargo
display_name = "armband, cargo"
path = /obj/item/clothing/accessory/armband/cargo
/datum/gear/accessory/emt
display_name = "armband, EMT"
path = /obj/item/clothing/accessory/armband/medgreen
/datum/gear/accessory/engineering
display_name = "armband, engineering"
path = /obj/item/clothing/accessory/armband/engine
/datum/gear/accessory/hydroponics
display_name = "armband, hydroponics"
path = /obj/item/clothing/accessory/armband/hydro
/datum/gear/accessory/medical
display_name = "armband, medical"
path = /obj/item/clothing/accessory/armband/med
/datum/gear/accessory/science
display_name = "armband, science"
path = /obj/item/clothing/accessory/armband/science
/datum/gear/accessory/holster
display_name = "holster, armpit"
path = /obj/item/clothing/accessory/holster/armpit
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective")
/datum/gear/accessory/holster/hip
display_name = "holster, hip"
path = /obj/item/clothing/accessory/holster/hip
/datum/gear/accessory/holster/waist
display_name = "holster, waist"
path = /obj/item/clothing/accessory/holster/waist
/datum/gear/accessory/tie
display_name = "tie, black"
path = /obj/item/clothing/accessory/black
/datum/gear/accessory/tie/blue
display_name = "tie, blue"
path = /obj/item/clothing/accessory/blue
/datum/gear/accessory/tie/red
display_name = "tie, red"
path = /obj/item/clothing/accessory/red
/datum/gear/accessory/tie/horrible
display_name = "tie, socially disgraceful"
path = /obj/item/clothing/accessory/horrible
/datum/gear/accessory/scarf
display_name = "scarf"
path = /obj/item/clothing/accessory/scarf
/datum/gear/accessory/scarf/red
display_name = "scarf, red"
path = /obj/item/clothing/accessory/scarf/red
/datum/gear/accessory/scarf/green
display_name = "scarf, green"
path = /obj/item/clothing/accessory/scarf/green
/datum/gear/accessory/scarf/darkblue
display_name = "scarf, dark blue"
path = /obj/item/clothing/accessory/scarf/darkblue
/datum/gear/accessory/scarf/purple
display_name = "scarf, purple"
path = /obj/item/clothing/accessory/scarf/purple
/datum/gear/accessory/scarf/yellow
display_name = "scarf, yellow"
path = /obj/item/clothing/accessory/scarf/yellow
/datum/gear/accessory/scarf/orange
display_name = "scarf, orange"
path = /obj/item/clothing/accessory/scarf/orange
/datum/gear/accessory/scarf/lightblue
display_name = "scarf, light blue"
path = /obj/item/clothing/accessory/scarf/lightblue
/datum/gear/accessory/scarf/white
display_name = "scarf, white"
path = /obj/item/clothing/accessory/scarf/white
/datum/gear/accessory/scarf/black
display_name = "scarf, black"
path = /obj/item/clothing/accessory/scarf/black
/datum/gear/accessory/scarf/zebra
display_name = "scarf, zebra"
path = /obj/item/clothing/accessory/scarf/zebra
/datum/gear/accessory/scarf/christmas
display_name = "scarf, christmas"
path = /obj/item/clothing/accessory/scarf/christmas
/datum/gear/accessory/scarf/stripedred
display_name = "scarf, striped red"
path = /obj/item/clothing/accessory/stripedredscarf
/datum/gear/accessory/scarf/stripedgreen
display_name = "scarf, striped green"
path = /obj/item/clothing/accessory/stripedgreenscarf
/datum/gear/accessory/scarf/stripedblue
display_name = "scarf, striped blue"
path = /obj/item/clothing/accessory/stripedbluescarf
/datum/gear/accessory/brown_vest
display_name = "webbing, engineering"
path = /obj/item/clothing/accessory/storage/brown_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
/datum/gear/accessory/black_vest
display_name = "webbing, security"
path = /obj/item/clothing/accessory/storage/black_vest
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/accessory/webbing
display_name = "webbing, simple"
path = /obj/item/clothing/accessory/storage/webbing
cost = 2

View File

@@ -0,0 +1,16 @@
/datum/gear/lipstick
display_name = "lipstick, black"
path = /obj/item/weapon/lipstick/black
sort_category = "Cosmetics"
/datum/gear/lipstick/jade
display_name = "lipstick, jade"
path = /obj/item/weapon/lipstick/jade
/datum/gear/lipstick/purple
display_name = "lipstick, purple"
path = /obj/item/weapon/lipstick/purple
/datum/gear/lipstick/red
display_name = "lipstick, red"
path = /obj/item/weapon/lipstick

View File

@@ -0,0 +1,10 @@
// Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use
// the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset.
/datum/gear/ears
display_name = "earmuffs"
path = /obj/item/clothing/ears/earmuffs
sort_category = "Earwear"
/datum/gear/ears/headphones
display_name = "headphones"
path = /obj/item/clothing/ears/earmuffs/headphones

View File

@@ -0,0 +1,62 @@
// Eyes
/datum/gear/eyes
display_name = "eyepatch"
path = /obj/item/clothing/glasses/eyepatch
slot = slot_glasses
sort_category = "Glasses and Eyewear"
/datum/gear/eyes/glasses
display_name = "Glasses, prescription"
path = /obj/item/clothing/glasses/regular
/datum/gear/eyes/glasses/green
display_name = "Glasses, green"
path = /obj/item/clothing/glasses/gglasses
/datum/gear/eyes/glasses/prescriptionhipster
display_name = "Glasses, hipster"
path = /obj/item/clothing/glasses/regular/hipster
/datum/gear/eyes/glasses/monocle
display_name = "Monocle"
path = /obj/item/clothing/glasses/monocle
/datum/gear/eyes/scanning_goggles
display_name = "scanning goggles"
path = /obj/item/clothing/glasses/regular/scanners
/datum/gear/eyes/sciencegoggles
display_name = "Science Goggles"
path = /obj/item/clothing/glasses/science
/datum/gear/eyes/security
display_name = "Security HUD (Security)"
path = /obj/item/clothing/glasses/hud/security
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/eyes/security/prescriptionsec
display_name = "Security HUD, prescription (Security)"
path = /obj/item/clothing/glasses/hud/security/prescription
/datum/gear/eyes/medical
display_name = "Medical HUD (Medical)"
path = /obj/item/clothing/glasses/hud/health
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/eyes/medical/prescriptionmed
display_name = "Medical HUD, prescription (Medical)"
path = /obj/item/clothing/glasses/hud/health/prescription
/datum/gear/eyes/shades
display_name = "Sunglasses, fat (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/big
allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective")
/datum/gear/eyes/glasses/fakesun
display_name = "Sunglasses, stylish"
path = /obj/item/clothing/glasses/fakesunglasses
/datum/gear/eyes/shades/prescriptionsun
display_name = "sunglasses, presciption (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/prescription
cost = 2

View File

@@ -0,0 +1,39 @@
/datum/gear/cane
display_name = "cane"
path = /obj/item/weapon/cane
/datum/gear/dice
display_name = "d20"
path = /obj/item/weapon/dice/d20
/datum/gear/cards
display_name = "deck of cards"
path = /obj/item/weapon/deck/cards
/datum/gear/tarot
display_name = "deck of tarot cards"
path = /obj/item/weapon/deck/tarot
/datum/gear/holder
display_name = "card holder"
path = /obj/item/weapon/deck/holder
/datum/gear/cardemon_pack
display_name = "Cardemon booster pack"
path = /obj/item/weapon/pack/cardemon
/datum/gear/spaceball_pack
display_name = "Spaceball booster pack"
path = /obj/item/weapon/pack/spaceball
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
/datum/gear/vacflask
display_name = "vacuum-flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask
/datum/gear/comb
display_name = "purple comb"
path = /obj/item/weapon/haircomb

View File

@@ -0,0 +1,51 @@
// Gloves
/datum/gear/gloves
display_name = "gloves, black"
path = /obj/item/clothing/gloves/black
cost = 2
slot = slot_gloves
sort_category = "Gloves and Handwear"
/datum/gear/gloves/blue
display_name = "gloves, blue"
path = /obj/item/clothing/gloves/blue
/datum/gear/gloves/brown
display_name = "gloves, brown"
path = /obj/item/clothing/gloves/brown
/datum/gear/gloves/light_brown
display_name = "gloves, light-brown"
path = /obj/item/clothing/gloves/light_brown
/datum/gear/gloves/green
display_name = "gloves, green"
path = /obj/item/clothing/gloves/green
/datum/gear/gloves/grey
display_name = "gloves, grey"
path = /obj/item/clothing/gloves/grey
/datum/gear/gloves/latex
display_name = "gloves, latex"
path = /obj/item/clothing/gloves/latex
/datum/gear/gloves/orange
display_name = "gloves, orange"
path = /obj/item/clothing/gloves/orange
/datum/gear/gloves/purple
display_name = "gloves, purple"
path = /obj/item/clothing/gloves/purple
/datum/gear/gloves/rainbow
display_name = "gloves, rainbow"
path = /obj/item/clothing/gloves/rainbow
/datum/gear/gloves/red
display_name = "gloves, red"
path = /obj/item/clothing/gloves/red
/datum/gear/gloves/white
display_name = "gloves, white"
path = /obj/item/clothing/gloves/white

View File

@@ -0,0 +1,271 @@
/datum/gear/head
display_name = "bandana, pirate-red"
path = /obj/item/clothing/head/bandana
slot = slot_head
sort_category = "Hats and Headwear"
/datum/gear/head/bandana_green
display_name = "bandana, green"
path = /obj/item/clothing/head/greenbandana
/datum/gear/head/bandana_orange
display_name = "bandana, orange"
path = /obj/item/clothing/head/orangebandana
/datum/gear/head/beret
display_name = "beret, red"
path = /obj/item/clothing/head/beret
/datum/gear/head/beret/bsec
display_name = "beret, navy (officer)"
path = /obj/item/clothing/head/beret/sec/navy/officer
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/head/beret/bsec_warden
display_name = "beret, navy (warden)"
path = /obj/item/clothing/head/beret/sec/navy/warden
allowed_roles = list("Head of Security","Warden")
/datum/gear/head/beret/bsec_hos
display_name = "beret, navy (hos)"
path = /obj/item/clothing/head/beret/sec/navy/hos
allowed_roles = list("Head of Security")
/datum/gear/head/beret/eng
display_name = "beret, engie-orange"
path = /obj/item/clothing/head/beret/engineering
/datum/gear/head/beret/purp
display_name = "beret, purple"
path = /obj/item/clothing/head/beret/purple
/datum/gear/head/beret/sec
display_name = "beret, red (security)"
path = /obj/item/clothing/head/beret/sec
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/head/cap
display_name = "cap, black"
path = /obj/item/clothing/head/soft/black
/datum/gear/head/cap/blue
display_name = "cap, blue"
path = /obj/item/clothing/head/soft/blue
/datum/gear/head/cap/mailman
display_name = "cap, blue station"
path = /obj/item/clothing/head/mailman
/datum/gear/head/cap/flat
display_name = "cap, brown-flat"
path = /obj/item/clothing/head/flatcap
/datum/gear/head/cap/corp
display_name = "cap, corporate (Security)"
path = /obj/item/clothing/head/soft/sec/corp
allowed_roles = list("Security Officer","Head of Security","Warden", "Detective")
/datum/gear/head/cap/green
display_name = "cap, green"
path = /obj/item/clothing/head/soft/green
/datum/gear/head/cap/grey
display_name = "cap, grey"
path = /obj/item/clothing/head/soft/grey
/datum/gear/head/cap/orange
display_name = "cap, orange"
path = /obj/item/clothing/head/soft/orange
/datum/gear/head/cap/purple
display_name = "cap, purple"
path = /obj/item/clothing/head/soft/purple
/datum/gear/head/cap/rainbow
display_name = "cap, rainbow"
path = /obj/item/clothing/head/soft/rainbow
/datum/gear/head/cap/red
display_name = "cap, red"
path = /obj/item/clothing/head/soft/red
/datum/gear/head/cap/sec
display_name = "cap, security (Security)"
path = /obj/item/clothing/head/soft/sec
allowed_roles = list("Security Officer","Head of Security","Warden", "Detective")
/datum/gear/head/cap/yellow
display_name = "cap, yellow"
path = /obj/item/clothing/head/soft/yellow
/datum/gear/head/cap/white
display_name = "cap, white"
path = /obj/item/clothing/head/soft/mime
/datum/gear/head/cowboy
display_name = "cowboy, rodeo"
path = /obj/item/clothing/head/cowboy_hat
cost = 3
/datum/gear/head/hairflower
display_name = "hair flower pin, red"
path = /obj/item/clothing/head/hairflower
/datum/gear/head/hairflower/yellow
display_name = "hair flower pin, yellow"
path = /obj/item/clothing/head/hairflower/yellow
/datum/gear/head/hairflower/pink
display_name = "hair flower pin, pink"
path = /obj/item/clothing/head/hairflower/pink
/datum/gear/head/hairflower/blue
display_name = "hair flower pin, blue"
path = /obj/item/clothing/head/hairflower/blue
/datum/gear/head/hairflower/violet
display_name = "hair flower pin, violet"
path = /obj/item/clothing/head/hairflower/violet
/datum/gear/head/hairflower/orange
display_name = "hair flower pin, orange"
path = /obj/item/clothing/head/hairflower/orange
/datum/gear/head/hardhat
display_name = "hardhat, yellow"
path = /obj/item/clothing/head/hardhat
cost = 2
/datum/gear/head/hardhat/blue
display_name = "hardhat, blue"
path = /obj/item/clothing/head/hardhat/dblue
/datum/gear/head/hardhat/orange
display_name = "hardhat, orange"
path = /obj/item/clothing/head/hardhat/orange
/datum/gear/head/hardhat/red
display_name = "hardhat, red"
path = /obj/item/clothing/head/hardhat/red
/datum/gear/head/boater
display_name = "hat, boatsman"
path = /obj/item/clothing/head/boaterhat
/datum/gear/head/bowler
display_name = "hat, bowler"
path = /obj/item/clothing/head/bowler
/datum/gear/head/fez
display_name = "hat, fez"
path = /obj/item/clothing/head/fez
/datum/gear/head/tophat
display_name = "hat, tophat"
path = /obj/item/clothing/head/that
/datum/gear/head/philosopher_wig
display_name = "natural philosopher's wig"
path = /obj/item/clothing/head/philosopher_wig
/datum/gear/head/ushanka
display_name = "ushanka"
path = /obj/item/clothing/head/ushanka
/datum/gear/head/santahat
display_name = "santa hat, red (holiday)"
path = /obj/item/clothing/head/santa
cost = 11
/datum/gear/head/santahat/green
display_name = "santa hat, green (holiday)"
path = /obj/item/clothing/head/santa/green
/datum/gear/head/zhan_scarf
display_name = "Zhan headscarf"
path = /obj/item/clothing/head/tajaran/scarf
whitelisted = "Tajara"
/datum/gear/head/hijab
display_name = "Black hijab"
path = /obj/item/clothing/head/hijab
/datum/gear/head/hijab/white
display_name = "White hijab"
path = /obj/item/clothing/head/hijab/white
/datum/gear/head/hijab/aqua
display_name = "Aqua hijab"
path = /obj/item/clothing/head/hijab/aqua
/datum/gear/head/hijab/blue
display_name = "Blue hijab"
path = /obj/item/clothing/head/hijab/blue
/datum/gear/head/hijab/brown
display_name = "Brown hijab"
path = /obj/item/clothing/head/hijab/brown
/datum/gear/head/hijab/darkblue
display_name = "Dark blue hijab"
path = /obj/item/clothing/head/hijab/darkblue
/datum/gear/head/hijab/darkred
display_name = "Dark red hijab"
path = /obj/item/clothing/head/hijab/darkred
/datum/gear/head/hijab/green
display_name = "Green hijab"
path = /obj/item/clothing/head/hijab/green
/datum/gear/head/hijab/green
display_name = "Green hijab"
path = /obj/item/clothing/head/hijab/grey
/datum/gear/head/hijab/lightblue
display_name = "Light blue hijab"
path = /obj/item/clothing/head/hijab/lightblue
/datum/gear/head/hijab/lightbrown
display_name = "Light brown hijab"
path = /obj/item/clothing/head/hijab/lightbrown
/datum/gear/head/hijab/lightgreen
display_name = "Light green hijab"
path = /obj/item/clothing/head/hijab/lightgreen
/datum/gear/head/hijab/lightpurple
display_name = "Light purple hijab"
path = /obj/item/clothing/head/hijab/lightpurple
/datum/gear/head/hijab/lightred
display_name = "Light red hijab"
path = /obj/item/clothing/head/hijab/lightred
/datum/gear/head/hijab/maroon
display_name = "Maroon hijab"
path = /obj/item/clothing/head/hijab/maroon
/datum/gear/head/hijab/orange
display_name = "Orange hijab"
path = /obj/item/clothing/head/hijab/orange
/datum/gear/head/hijab/pink
display_name = "Pink hijab"
path = /obj/item/clothing/head/hijab/pink
/datum/gear/head/hijab/purple
display_name = "Purple hijab"
path = /obj/item/clothing/head/hijab/purple
/datum/gear/head/hijab/red
display_name = "Red hijab"
path = /obj/item/clothing/head/hijab/red
/datum/gear/head/hijab/yellowgreen
display_name = "Yellow green hijab"
path = /obj/item/clothing/head/hijab/yellowgreen
/datum/gear/head/hijab/yellow
display_name = "Yellow hijab"
path = /obj/item/clothing/head/hijab/yellow

View File

@@ -0,0 +1,23 @@
// Mask
/datum/gear/mask
display_name = "bandana, blue"
path = /obj/item/clothing/mask/bandana/blue
slot = slot_wear_mask
sort_category = "Masks and Facewear"
/datum/gear/mask/gold
display_name = "bandana, gold"
path = /obj/item/clothing/mask/bandana/gold
/datum/gear/mask/green
display_name = "bandana, green 2"
path = /obj/item/clothing/mask/bandana/green
/datum/gear/mask/red
display_name = "bandana, red"
path = /obj/item/clothing/mask/bandana/red
/datum/gear/mask/sterile
display_name = "sterile mask"
path = /obj/item/clothing/mask/surgical
cost = 2

View File

@@ -0,0 +1,98 @@
// Shoelocker
/datum/gear/shoes
display_name = "jackboots"
path = /obj/item/clothing/shoes/jackboots
slot = slot_shoes
sort_category = "Shoes and Footwear"
/datum/gear/shoes/toeless
display_name = "toe-less jackboots"
path = /obj/item/clothing/shoes/jackboots/unathi
/datum/gear/shoes/workboots
display_name = "workboots"
path = /obj/item/clothing/shoes/workboots
/datum/gear/shoes/sandals
display_name = "sandals"
path = /obj/item/clothing/shoes/sandal
/datum/gear/shoes/black
display_name = "shoes, black"
path = /obj/item/clothing/shoes/black
/datum/gear/shoes/blue
display_name = "shoes, blue"
path = /obj/item/clothing/shoes/blue
/datum/gear/shoes/brown
display_name = "shoes, brown"
path = /obj/item/clothing/shoes/brown
/datum/gear/shoes/lacey
display_name = "shoes, classy"
path = /obj/item/clothing/shoes/laceup
/datum/gear/shoes/dress
display_name = "shoes, dress"
path = /obj/item/clothing/shoes/laceup
/datum/gear/shoes/green
display_name = "shoes, green"
path = /obj/item/clothing/shoes/green
/datum/gear/shoes/leather
display_name = "shoes, leather"
path = /obj/item/clothing/shoes/leather
/datum/gear/shoes/orange
display_name = "shoes, orange"
path = /obj/item/clothing/shoes/orange
/datum/gear/shoes/purple
display_name = "shoes, purple"
path = /obj/item/clothing/shoes/purple
/datum/gear/shoes/rainbow
display_name = "shoes, rainbow"
path = /obj/item/clothing/shoes/rainbow
/datum/gear/shoes/red
display_name = "shoes, red"
path = /obj/item/clothing/shoes/red
/datum/gear/shoes/white
display_name = "shoes, white"
path = /obj/item/clothing/shoes/white
/datum/gear/shoes/yellow
display_name = "shoes, yellow"
path = /obj/item/clothing/shoes/yellow
/datum/gear/shoes/flats
display_name = "flats, black"
path = /obj/item/clothing/shoes/flats
/datum/gear/shoes/flats/blue
display_name = "flats, blue"
path = /obj/item/clothing/shoes/flats/blue
/datum/gear/shoes/flats/brown
display_name = "flats, brown"
path = /obj/item/clothing/shoes/flats/brown
/datum/gear/shoes/flats/orange
display_name = "flats, orange"
path = /obj/item/clothing/shoes/flats/orange
/datum/gear/shoes/flats/purple
display_name = "flats, purple"
path = /obj/item/clothing/shoes/flats/purple
/datum/gear/shoes/flats/red
display_name = "flats, red"
path = /obj/item/clothing/shoes/flats/red
/datum/gear/shoes/flats/white
display_name = "flats, white"
path = /obj/item/clothing/shoes/flats/white

View File

@@ -0,0 +1,19 @@
/datum/gear/smokingpipe
display_name = "pipe, smoking"
path = /obj/item/clothing/mask/smokable/pipe
/datum/gear/cornpipe
display_name = "pipe, corn"
path = /obj/item/clothing/mask/smokable/pipe/cobpipe
/datum/gear/matchbook
display_name = "matchbook"
path = /obj/item/weapon/storage/box/matches
/datum/gear/zippo
display_name = "zippo"
path = /obj/item/weapon/flame/lighter/zippo
/datum/gear/ashtray
display_name = "ashtray, plastic"
path = /obj/item/weapon/material/ashtray/plastic

View File

@@ -0,0 +1,208 @@
// Suit slot
/datum/gear/suit
display_name = "apron, blue"
path = /obj/item/clothing/suit/apron
slot = slot_wear_suit
sort_category = "Suits and Overwear"
cost = 2
/datum/gear/suit/leather_coat
display_name = "leather coat"
path = /obj/item/clothing/suit/leathercoat
/datum/gear/suit/puffer_coat
display_name = "puffer coat"
path = /obj/item/clothing/suit/jacket/puffer
/datum/gear/suit/puffer_vest
display_name = "puffer vest"
path = /obj/item/clothing/suit/jacket/puffer/vest
/datum/gear/suit/bomber
display_name = "bomber jacket"
path = /obj/item/clothing/suit/storage/toggle/bomber
/datum/gear/suit/bomber_alt
display_name = "bomber jacket 2"
path = /obj/item/clothing/suit/storage/bomber/alt
/datum/gear/suit/leather_jacket
display_name = "leather jacket, black"
path = /obj/item/clothing/suit/storage/leather_jacket
/datum/gear/suit/leather_jacket_alt
display_name = "leather jacket 2, black"
path = /obj/item/clothing/suit/storage/leather_jacket/alt
/datum/gear/suit/leather_jacket_nt
display_name = "leather jacket, corporate, black"
path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen
/datum/gear/suit/brown_jacket
display_name = "leather jacket, brown"
path = /obj/item/clothing/suit/storage/toggle/brown_jacket
/datum/gear/suit/brown_jacket_nt
display_name = "leather jacket, corporate, brown"
path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen
/datum/gear/suit/mil
display_name = "military jacket"
path = /obj/item/clothing/suit/storage/miljacket
/datum/gear/suit/mil/alt
display_name = "military jacket, alt"
path = /obj/item/clothing/suit/storage/miljacket/alt
/datum/gear/suit/hazard_vest
display_name = "hazard vest"
path = /obj/item/clothing/suit/storage/hazardvest
/datum/gear/suit/hoodie
display_name = "hoodie, grey"
path = /obj/item/clothing/suit/storage/toggle/hoodie
/datum/gear/suit/hoodie/red
display_name = "hoodie, red"
path = /obj/item/clothing/suit/storage/toggle/hoodie/red
/datum/gear/suit/hoodie/blue
display_name = "hoodie, blue"
path = /obj/item/clothing/suit/storage/toggle/hoodie/blue
/datum/gear/suit/hoodie/yellow
display_name = "hoodie, yellow"
path = /obj/item/clothing/suit/storage/toggle/hoodie/yellow
/datum/gear/suit/hoodie/green
display_name = "hoodie, green"
path = /obj/item/clothing/suit/storage/toggle/hoodie/green
/datum/gear/suit/hoodie/orange
display_name = "hoodie, orange"
path = /obj/item/clothing/suit/storage/toggle/hoodie/orange
/datum/gear/suit/hoodie/black
display_name = "hoodie, black"
path = /obj/item/clothing/suit/storage/toggle/hoodie/black
/datum/gear/suit/hoodie/cti
display_name = "hoodie, CTI"
path = /obj/item/clothing/suit/storage/toggle/hoodie/cti
/datum/gear/suit/hoodie/mu
display_name = "hoodie, MU"
path = /obj/item/clothing/suit/storage/toggle/hoodie/mu
/datum/gear/suit/hoodie/nt
display_name = "hoodie, NT"
path = /obj/item/clothing/suit/storage/toggle/hoodie/nt
/datum/gear/suit/labcoat
display_name = "labcoat"
path = /obj/item/clothing/suit/storage/toggle/labcoat
/datum/gear/suit/labcoat/blue
display_name = "labcoat, blue"
path = /obj/item/clothing/suit/storage/toggle/labcoat/blue
/datum/gear/suit/labcoat/green
display_name = "labcoat, green"
path = /obj/item/clothing/suit/storage/toggle/labcoat/green
/datum/gear/suit/labcoat/orange
display_name = "labcoat, orange"
path = /obj/item/clothing/suit/storage/toggle/labcoat/orange
/datum/gear/suit/labcoat/purple
display_name = "labcoat, purple"
path = /obj/item/clothing/suit/storage/toggle/labcoat/purple
/datum/gear/suit/labcoat/pink
display_name = "labcoat, pink"
path = /obj/item/clothing/suit/storage/toggle/labcoat/pink
/datum/gear/suit/labcoat/red
display_name = "labcoat, red"
path = /obj/item/clothing/suit/storage/toggle/labcoat/red
/datum/gear/suit/labcoat/yellow
display_name = "labcoat, yellow"
path = /obj/item/clothing/suit/storage/toggle/labcoat/yellow
/datum/gear/suit/labcoat/emt
display_name = "labcoat, EMT (Medical)"
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/suit/overalls
display_name = "overalls"
path = /obj/item/clothing/suit/apron/overalls
cost = 1
/datum/gear/suit/poncho
display_name = "poncho, tan"
path = /obj/item/clothing/suit/poncho
cost = 1
/datum/gear/suit/poncho/blue
display_name = "poncho, blue"
path = /obj/item/clothing/suit/poncho/blue
/datum/gear/suit/poncho/green
display_name = "poncho, green"
path = /obj/item/clothing/suit/poncho/green
/datum/gear/suit/poncho/purple
display_name = "poncho, purple"
path = /obj/item/clothing/suit/poncho/purple
/datum/gear/suit/poncho/red
display_name = "poncho, red"
path = /obj/item/clothing/suit/poncho/red
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
cost = 1
/datum/gear/suit/black_lawyer_jacket
display_name = "suit jacket, black"
path = /obj/item/clothing/suit/storage/toggle/internalaffairs
/datum/gear/suit/blue_lawyer_jacket
display_name = "suit jacket, blue"
path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
/datum/gear/suit/purple_lawyer_jacket
display_name = "suit jacket, purple"
path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket
/datum/gear/suit/suspenders
display_name = "suspenders"
path = /obj/item/clothing/suit/suspenders
/datum/gear/suit/wcoat
display_name = "waistcoat"
path = /obj/item/clothing/suit/wcoat
cost = 1
/datum/gear/suit/forensics
display_name = "forensics long, red"
path = /obj/item/clothing/suit/storage/forensics/red/long
allowed_roles = list("Detective")
/datum/gear/suit/forensics/blue
display_name = "forensics long, blue"
path = /obj/item/clothing/suit/storage/forensics/blue/long
allowed_roles = list("Detective")
/datum/gear/suit/forensics/blue/short
display_name = "forensics, blue"
path = /obj/item/clothing/suit/storage/forensics/blue
allowed_roles = list("Detective")
/datum/gear/suit/forensics/red/short
display_name = "forensics, red"
path = /obj/item/clothing/suit/storage/forensics/red
allowed_roles = list("Detective")

View File

@@ -0,0 +1,441 @@
// Uniform slot
/datum/gear/uniform
display_name = "blazer, blue"
path = /obj/item/clothing/under/blazer
slot = slot_w_uniform
sort_category = "Uniforms and Casual Dress"
/datum/gear/uniform/cheongsam
display_name = "cheongsam, white"
path = /obj/item/clothing/under/cheongsam
/datum/gear/uniform/kilt
display_name = "kilt"
path = /obj/item/clothing/under/kilt
/datum/gear/uniform/croptop
display_name = "croptop, NT"
path = /obj/item/clothing/under/croptop
/datum/gear/uniform/croptop/grey
display_name = "croptop, grey"
path = /obj/item/clothing/under/croptop/grey
/datum/gear/uniform/croptop/red
display_name = "croptop, red"
path = /obj/item/clothing/under/croptop/red
/datum/gear/uniform/cuttop
display_name = "cut top, grey"
path = /obj/item/clothing/under/cuttop
/datum/gear/uniform/cuttop/red
display_name = "cut top, red"
path = /obj/item/clothing/under/cuttop/red
/datum/gear/uniform/jumpskirt
display_name = "jumpskirt, black"
path = /obj/item/clothing/under/blackjumpskirt
/datum/gear/uniform/jumpsuit
display_name = "jumpsuit, rainbow"
path = /obj/item/clothing/under/rainbow
/datum/gear/uniform/jumpsuit/black
display_name = "jumpsuit, black"
path = /obj/item/clothing/under/color/black
/datum/gear/uniform/jumpsuit/blackfemale
display_name = "jumpsuit, female-black"
path = /obj/item/clothing/under/color/blackf
/datum/gear/uniform/jumpsuit/blue
display_name = "jumpsuit, blue"
path = /obj/item/clothing/under/color/blue
/datum/gear/uniform/jumpsuit/green
display_name = "jumpsuit, green"
path = /obj/item/clothing/under/color/green
/datum/gear/uniform/jumpsuit/grey
display_name = "jumpsuit, grey"
path = /obj/item/clothing/under/color/grey
/datum/gear/uniform/jumpsuit/pink
display_name = "jumpsuit, pink"
path = /obj/item/clothing/under/color/pink
/datum/gear/uniform/jumpsuit/white
display_name = "jumpsuit, white"
path = /obj/item/clothing/under/color/white
/datum/gear/uniform/jumpsuit/yellow
display_name = "jumpsuit, yellow"
path = /obj/item/clothing/under/color/yellow
/datum/gear/uniform/jumpsuit/lightblue
display_name = "jumpsuit, lightblue"
path = /obj/item/clothing/under/lightblue
/datum/gear/uniform/jumpsuit/red
display_name = "jumpsuit, red"
path = /obj/item/clothing/under/color/red
/datum/gear/uniform/jumpsuit/aqua
display_name = "jumpsuit, aqua"
path = /obj/item/clothing/under/aqua
/datum/gear/uniform/jumpsuit/purple
display_name = "jumpsuit, purple"
path = /obj/item/clothing/under/purple
/datum/gear/uniform/jumpsuit/lightpurple
display_name = "jumpsuit, lightpurple"
path = /obj/item/clothing/under/lightpurple
/datum/gear/uniform/jumpsuit/lightgreen
display_name = "jumpsuit, lightgreen"
path = /obj/item/clothing/under/lightgreen
/datum/gear/uniform/jumpsuit/lightbrown
display_name = "jumpsuit, lightbrown"
path = /obj/item/clothing/under/lightbrown
/datum/gear/uniform/jumpsuit/brown
display_name = "jumpsuit, brown"
path = /obj/item/clothing/under/brown
/datum/gear/uniform/jumpsuit/yellowgreen
display_name = "jumpsuit, yellowgreen"
path = /obj/item/clothing/under/yellowgreen
/datum/gear/uniform/jumpsuit/darkblue
display_name = "jumpsuit, darkblue"
path = /obj/item/clothing/under/darkblue
/datum/gear/uniform/jumpsuit/lightred
display_name = "jumpsuit, lightred"
path = /obj/item/clothing/under/lightred
/datum/gear/uniform/jumpsuit/darkred
display_name = "jumpsuit, darkred"
path = /obj/item/clothing/under/darkred
/datum/gear/uniform/skirt
display_name = "plaid skirt, blue"
path = /obj/item/clothing/under/dress/plaid_blue
/datum/gear/uniform/skirt/purple
display_name = "plaid skirt, purple"
path = /obj/item/clothing/under/dress/plaid_purple
/datum/gear/uniform/skirt/red
display_name = "plaid skirt, red"
path = /obj/item/clothing/under/dress/plaid_red
/datum/gear/uniform/skirt/black
display_name = "skirt, black"
path = /obj/item/clothing/under/blackskirt
/datum/gear/uniform/skirt/ce
display_name = "skirt, ce"
path = /obj/item/clothing/under/rank/chief_engineer/skirt
allowed_roles = list("Chief Engineer")
/datum/gear/uniform/skirt/atmos
display_name = "skirt, atmos"
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
allowed_roles = list("Chief Engineer","Atmospheric Technician")
/datum/gear/uniform/skirt/eng
display_name = "skirt, engineer"
path = /obj/item/clothing/under/rank/engineer/skirt
allowed_roles = list("Chief Engineer","Station Engineer")
/datum/gear/uniform/skirt/roboticist
display_name = "skirt, roboticist"
path = /obj/item/clothing/under/rank/roboticist/skirt
allowed_roles = list("Research Director","Roboticist")
/datum/gear/uniform/skirt/cmo
display_name = "skirt, cmo"
path = /obj/item/clothing/under/rank/chief_medical_officer
allowed_roles = list("Chief Medical Officer")
/datum/gear/uniform/skirt/chem
display_name = "skirt, chemist"
path = /obj/item/clothing/under/rank/chemist/skirt
allowed_roles = list("Chief Medical Officer","Chemist")
/datum/gear/uniform/skirt/viro
display_name = "skirt, virologist"
path = /obj/item/clothing/under/rank/virologist/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor")
/datum/gear/uniform/skirt/med
display_name = "skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
/datum/gear/uniform/skirt/sci
display_name = "skirt, scientist"
path = /obj/item/clothing/under/rank/scientist/skirt
allowed_roles = list("Research Director","Scientist")
/datum/gear/uniform/skirt/cargo
display_name = "skirt, cargo"
path = /obj/item/clothing/under/rank/cargotech/skirt
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/skirt/qm
display_name = "skirt, QM"
path = /obj/item/clothing/under/rank/cargo/skirt
allowed_roles = list("Quartermaster")
/datum/gear/uniform/jeans_qm
display_name = "jeans, QM"
path = /obj/item/clothing/under/rank/cargo/jeans
allowed_roles = list("Quartermaster")
/datum/gear/uniform/jeans_qmf
display_name = "female jeans, QM"
path = /obj/item/clothing/under/rank/cargo/jeans/female
allowed_roles = list("Quartermaster")
/datum/gear/uniform/jeans_cargo
display_name = "jeans, cargo"
path = /obj/item/clothing/under/rank/cargotech/jeans
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/jeans_cargof
display_name = "female jeans, cargo"
path = /obj/item/clothing/under/rank/cargotech/jeans/female
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/pants
display_name = "pants, white"
path = /obj/item/clothing/under/pants/white
/datum/gear/uniform/pants/red
display_name = "pants, red"
path = /obj/item/clothing/under/pants/red
/datum/gear/uniform/pants/black
display_name = "pants, black"
path = /obj/item/clothing/under/pants/black
/datum/gear/uniform/pants/tan
display_name = "pants, tan"
path = /obj/item/clothing/under/pants/tan
/datum/gear/uniform/pants/track
display_name = "pants, track"
path = /obj/item/clothing/under/pants/track
/datum/gear/uniform/pants/khaki
display_name = "pants, khaki"
path = /obj/item/clothing/under/pants/khaki
/datum/gear/uniform/pants/camo
display_name = "pants, camo"
path = /obj/item/clothing/under/pants/camo
/datum/gear/uniform/pants/jeans
display_name = "pants, jeans"
path = /obj/item/clothing/under/pants/jeans
/datum/gear/uniform/pants/jeans/classic
display_name = "pants, classic jeans"
path = /obj/item/clothing/under/pants/classicjeans
/datum/gear/uniform/pants/jeans/mustang
display_name = "pants, mustang jeans"
path = /obj/item/clothing/under/pants/mustangjeans
/datum/gear/uniform/pants/jeans/black
display_name = "pants, black jeans"
path = /obj/item/clothing/under/pants/blackjeans
/datum/gear/uniform/pants/jeans/youngfolks
display_name = "pants, young folks jeans"
path = /obj/item/clothing/under/pants/youngfolksjeans
/datum/gear/uniform/jeans
display_name = "shorts, jeans"
path = /obj/item/clothing/under/shorts/jeans
/datum/gear/uniform/jeans/classic
display_name = "shorts, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic
/datum/gear/uniform/jeans/mustang
display_name = "shorts, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang
/datum/gear/uniform/jeans/youngfolks
display_name = "shorts, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks
/datum/gear/uniform/jeans/black
display_name = "shorts, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black
/datum/gear/uniform/jeans/female
display_name = "shorts, female, jeans"
path = /obj/item/clothing/under/shorts/jeans/female
/datum/gear/uniform/jeans/classic/female
display_name = "shorts, female, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic/female
/datum/gear/uniform/jeans/mustang/female
display_name = "shorts, female, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang/female
/datum/gear/uniform/jeans/youngfolks/female
display_name = "shorts, female, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks/female
/datum/gear/uniform/jeans/black/female
display_name = "shorts, female, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black/female
/datum/gear/uniform/khaki
display_name = "shorts, khaki"
path = /obj/item/clothing/under/shorts/khaki
/datum/gear/uniform/khaki/female
display_name = "shorts, female, khaki"
path = /obj/item/clothing/under/shorts/khaki/female
/datum/gear/uniform/suit //amish
display_name = "suit, amish"
path = /obj/item/clothing/under/sl_suit
/datum/gear/uniform/suit/black
display_name = "suit, black"
path = /obj/item/clothing/under/suit_jacket
/datum/gear/uniform/suit/shinyblack
display_name = "suit, shiny-black"
path = /obj/item/clothing/under/lawyer/black
/datum/gear/uniform/suit/blue
display_name = "suit, blue"
path = /obj/item/clothing/under/lawyer/blue
/datum/gear/uniform/suit/burgundy
display_name = "suit, burgundy"
path = /obj/item/clothing/under/suit_jacket/burgundy
/datum/gear/uniform/suit/checkered
display_name = "suit, checkered"
path = /obj/item/clothing/under/suit_jacket/checkered
/datum/gear/uniform/suit/charcoal
display_name = "suit, charcoal"
path = /obj/item/clothing/under/suit_jacket/charcoal
/datum/gear/uniform/suit/exec
display_name = "suit, executive"
path = /obj/item/clothing/under/suit_jacket/really_black
/datum/gear/uniform/suit/femaleexec
display_name = "suit, female-executive"
path = /obj/item/clothing/under/suit_jacket/female
/datum/gear/uniform/suit/gentle
display_name = "suit, gentlemen"
path = /obj/item/clothing/under/gentlesuit
/datum/gear/uniform/suit/navy
display_name = "suit, navy"
path = /obj/item/clothing/under/suit_jacket/navy
/datum/gear/uniform/suit/red
display_name = "suit, red"
path = /obj/item/clothing/under/suit_jacket/red
/datum/gear/uniform/suit/redlawyer
display_name = "suit, lawyer-red"
path = /obj/item/clothing/under/lawyer/red
/datum/gear/uniform/suit/oldman
display_name = "suit, old-man"
path = /obj/item/clothing/under/lawyer/oldman
/datum/gear/uniform/suit/purple
display_name = "suit, purple"
path = /obj/item/clothing/under/lawyer/purpsuit
/datum/gear/uniform/suit/tan
display_name = "suit, tan"
path = /obj/item/clothing/under/suit_jacket/tan
/datum/gear/uniform/suit/white
display_name = "suit, white"
path = /obj/item/clothing/under/scratch
/datum/gear/uniform/suit/whiteblue
display_name = "suit, white-blue"
path = /obj/item/clothing/under/lawyer/bluesuit
/datum/gear/uniform/scrubs
display_name = "scrubs, black"
path = /obj/item/clothing/under/rank/medical/black
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/uniform/scrubs/blue
display_name = "scrubs, blue"
path = /obj/item/clothing/under/rank/medical/blue
/datum/gear/uniform/scrubs/purple
display_name = "scrubs, purple"
path = /obj/item/clothing/under/rank/medical/purple
/datum/gear/uniform/scrubs/green
display_name = "scrubs, green"
path = /obj/item/clothing/under/rank/medical/green
/datum/gear/uniform/sundress
display_name = "sundress"
path = /obj/item/clothing/under/sundress
/datum/gear/uniform/sundress/white
display_name = "sundress, white"
path = /obj/item/clothing/under/sundress_white
/datum/gear/uniform/dress_fire
display_name = "flame dress"
path = /obj/item/clothing/under/dress/dress_fire
/datum/gear/uniform/uniform_captain
display_name = "uniform, captain's dress"
path = /obj/item/clothing/under/dress/dress_cap
allowed_roles = list("Captain")
/datum/gear/uniform/corpdetsuit
display_name = "uniform, corporate (Detective)"
path = /obj/item/clothing/under/det/corporate
allowed_roles = list("Detective","Head of Security")
/datum/gear/uniform/corpsecsuit
display_name = "uniform, corporate (Security)"
path = /obj/item/clothing/under/rank/security/corp
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/uniform/uniform_hop
display_name = "uniform, HoP's dress"
path = /obj/item/clothing/under/dress/dress_hop
allowed_roles = list("Head of Personnel")
/datum/gear/uniform/uniform_hr
display_name = "uniform, HR director (HoP)"
path = /obj/item/clothing/under/dress/dress_hr
allowed_roles = list("Head of Personnel")
/datum/gear/uniform/navysecsuit
display_name = "uniform, navyblue (Security)"
path = /obj/item/clothing/under/rank/security/navyblue
allowed_roles = list("Security Officer","Head of Security","Warden")

View File

@@ -0,0 +1,37 @@
// "Useful" items - I'm guessing things that might be used at work?
/datum/gear/utility
display_name = "briefcase"
path = /obj/item/weapon/storage/briefcase
sort_category = "Utility"
/datum/gear/utility/clipboard
display_name = "clipboard"
path = /obj/item/weapon/clipboard
/datum/gear/utility/communicator
display_name = "personal communicator"
path = /obj/item/device/communicator
/datum/gear/utility/folder_blue
display_name = "folder, blue"
path = /obj/item/weapon/folder/blue
/datum/gear/utility/folder_grey
display_name = "folder, grey"
path = /obj/item/weapon/folder
/datum/gear/utility/folder_red
display_name = "folder, red"
path = /obj/item/weapon/folder/red
/datum/gear/utility/folder_white
display_name = "folder, white"
path = /obj/item/weapon/folder/white
/datum/gear/utility/folder_yellow
display_name = "folder, yellow"
path = /obj/item/weapon/folder/yellow
/datum/gear/utility/paicard
display_name = "personal AI device"
path = /obj/item/device/paicard

View File

@@ -0,0 +1,99 @@
// Alien clothing.
/datum/gear/suit/zhan_furs
display_name = "Zhan-Khazan furs (Tajara)"
path = /obj/item/clothing/suit/tajaran/furs
whitelisted = "Tajara"
sort_category = "Xenowear"
/datum/gear/suit/unathi_mantle
display_name = "hide mantle (Unathi)"
path = /obj/item/clothing/suit/unathi/mantle
cost = 1
whitelisted = "Unathi"
sort_category = "Xenowear"
/datum/gear/ears/skrell
display_name = "headtail-wear, female, chain (Skrell)"
path = /obj/item/clothing/ears/skrell/chain
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/plate
display_name = "headtail-wear, male, bands (Skrell)"
path = /obj/item/clothing/ears/skrell/band
/datum/gear/ears/skrell/cloth //male/red
display_name = "headtail-wear, male, red, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male
/datum/gear/ears/skrell/cloth/male //black
display_name = "headtail-wear, male, black, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/black
/datum/gear/ears/skrell/cloth/male/blue
display_name = "headtail-wear, male, blue, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/blue
/datum/gear/ears/skrell/cloth/male/green
display_name = "headtail-wear, male, green, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/green
/datum/gear/ears/skrell/cloth/male/pink
display_name = "headtail-wear, male, pink, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/pink
/datum/gear/ears/skrell/cloth/female
display_name = "headtail-wear, female, red, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female
/datum/gear/ears/skrell/cloth/female/black
display_name = "headtail-wear, female, black, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/black
/datum/gear/ears/skrell/cloth/female/blue
display_name = "headtail-wear, female, blue, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/blue
/datum/gear/ears/skrell/cloth/female/green
display_name = "headtail-wear, female, green, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/green
/datum/gear/ears/skrell/cloth/female/pink
display_name = "headtail-wear, female, pink, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/pink
/datum/gear/uniform/jumpsuit/teshari
display_name = "smock, grey (Teshari)"
path = /obj/item/clothing/under/seromi
whitelisted = "Teshari"
sort_category = "Xenowear"
/datum/gear/uniform/jumpsuit/teshari/yellow
display_name = "smock, yellow (Teshari)"
path = /obj/item/clothing/under/seromi/yellow
/datum/gear/uniform/jumpsuit/teshari/red
display_name = "smock, red (Teshari)"
path = /obj/item/clothing/under/seromi/red
/datum/gear/uniform/jumpsuit/teshari/white
display_name = "smock, white (Teshari)"
path = /obj/item/clothing/under/seromi/white
/datum/gear/uniform/jumpsuit/teshari/medical
display_name = "smock, Medical (Teshari)"
path = /obj/item/clothing/under/seromi/medical
/datum/gear/uniform/jumpsuit/teshari/rainbow
display_name = "smock, rainbow (Teshari)"
path = /obj/item/clothing/under/seromi/rainbow
/datum/gear/mask/ipc_monitor
display_name = "display monitor (Full Body Prosthetic)"
path = /obj/item/clothing/mask/monitor
sort_category = "Xenowear"
/datum/gear/uniform/harness
display_name = "gear harness (Full Body Prosthetic, Diona)"
path = /obj/item/clothing/under/harness
sort_category = "Xenowear"

View File

@@ -23,9 +23,14 @@
sort_order = 4
category_item_type = /datum/category_item/player_setup_item/antagonism
/datum/category_group/player_setup_category/loadout_preferences
name = "Loadout"
sort_order = 5
category_item_type = /datum/category_item/player_setup_item/loadout
/datum/category_group/player_setup_category/global_preferences
name = "Global"
sort_order = 5
sort_order = 6
category_item_type = /datum/category_item/player_setup_item/player_global
/****************************

View File

@@ -368,4 +368,4 @@ datum/preferences
user << browse(dat, "window=saves;size=300x390")
/datum/preferences/proc/close_load_dialog(mob/user)
user << browse(null, "window=saves")
user << browse(null, "window=saves")

View File

@@ -25,7 +25,7 @@ var/global/list/home_system_choices = list(
"Vir",
"Nyx",
"Tau Ceti",
"Epsilon Ursae Majoris",
"Epsilon Ursae Minoris",
"S'randarr"
)

File diff suppressed because it is too large Load Diff

View File

@@ -90,4 +90,4 @@
return 1
#undef SAVEFILE_VERSION_MAX
#undef SAVEFILE_VERSION_MIN
#undef SAVEFILE_VERSION_MIN

View File

@@ -11,6 +11,7 @@
while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits).
*/
var/list/sprite_sheets_refit = null
var/ear_protection = 0
//Updates the icons of the mob wearing the clothing item, if any.
/obj/item/clothing/proc/update_clothing_icon()
@@ -101,7 +102,7 @@
w_class = 1.0
throwforce = 2
slot_flags = SLOT_EARS
sprite_sheets = list("Seromi" = 'icons/mob/species/seromi/ears.dmi')
sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ears.dmi')
/obj/item/clothing/ears/attack_hand(mob/user as mob)
if (!user) return
@@ -162,6 +163,7 @@
icon_state = "earmuffs"
item_state = "earmuffs"
slot_flags = SLOT_EARS | SLOT_TWOEARS
ear_protection = 2
/obj/item/clothing/ears/earmuffs/headphones
name = "headphones"
@@ -189,37 +191,6 @@
update_clothing_icon()
///////////////////////////////////////////////////////////////////////
//Glasses
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
SEE_OBJS // can see all objs, no matter what
SEE_TURFS // can see all turfs (and areas), no matter what
SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are
// in a lit area (via pixel_x,y or smooth movement), can see those pixels
BLIND // can't see anything
*/
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
w_class = 2.0
body_parts_covered = EYES
slot_flags = SLOT_EYES
var/vision_flags = 0
var/darkness_view = 0//Base human is 2
var/see_invisible = -1
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Seromi" = 'icons/mob/species/seromi/eyes.dmi',
)
/obj/item/clothing/glasses/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_glasses()
///////////////////////////////////////////////////////////////////////
//Gloves
/obj/item/clothing/gloves
name = "gloves"
@@ -236,7 +207,7 @@ BLIND // can't see anything
species_restricted = list("exclude","Unathi","Tajara", "Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Seromi" = 'icons/mob/species/seromi/gloves.dmi',
"Teshari" = 'icons/mob/species/seromi/gloves.dmi',
)
/obj/item/clothing/gloves/update_clothing_icon()
@@ -294,7 +265,7 @@ BLIND // can't see anything
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Seromi" = 'icons/mob/species/seromi/head.dmi'
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
/obj/item/clothing/head/attack_self(mob/user)
@@ -393,7 +364,7 @@ BLIND // can't see anything
body_parts_covered = FACE|EYES
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/masks.dmi',
"Seromi" = 'icons/mob/species/seromi/masks.dmi',
"Teshari" = 'icons/mob/species/seromi/masks.dmi',
)
var/voicechange = 0
@@ -426,10 +397,10 @@ BLIND // can't see anything
slowdown = SHOES_SLOWDOWN
force = 2
var/overshoes = 0
species_restricted = list("exclude","Seromi", "Unathi","Tajara","Vox")
species_restricted = list("exclude","Teshari", "Unathi","Tajara","Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/shoes.dmi',
"Seromi" = 'icons/mob/species/seromi/shoes.dmi',
"Teshari" = 'icons/mob/species/seromi/shoes.dmi',
)
/obj/item/clothing/shoes/proc/draw_knife()
@@ -504,7 +475,7 @@ BLIND // can't see anything
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Seromi" = 'icons/mob/species/seromi/suit.dmi'
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
)
/obj/item/clothing/suit/update_clothing_icon()
@@ -538,9 +509,10 @@ BLIND // can't see anything
var/list/accessories = list()
var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
"Seromi" = 'icons/mob/species/seromi/uniform.dmi'
"Teshari" = 'icons/mob/species/seromi/uniform.dmi'
)
//convenience var for defining the icon state for the overlay used when the clothing is worn.
@@ -584,6 +556,29 @@ BLIND // can't see anything
rolled_down = -1
if(H) update_clothing_icon()
/obj/item/clothing/under/proc/update_rollsleeves_status()
var/mob/living/carbon/human/H
if(istype(src.loc, /mob/living/carbon/human))
H = src.loc
var/icon/under_icon
if(icon_override)
under_icon = icon_override
else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype()])
under_icon = sprite_sheets[H.species.get_bodytype()]
else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = item_icons[slot_w_uniform_str]
else
under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it.
if(("[worn_state]_r_s") in icon_states(under_icon))
if(rolled_sleeves != 1)
rolled_sleeves = 0
else
rolled_sleeves = -1
if(H) update_clothing_icon()
/obj/item/clothing/under/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
@@ -729,14 +724,45 @@ BLIND // can't see anything
if(rolled_down == -1)
usr << "<span class='notice'>You cannot roll down [src]!</span>"
return
if((rolled_sleeves == 1) && !(rolled_down))
rolled_sleeves = 0
rolled_down = !rolled_down
if(rolled_down)
body_parts_covered &= LOWER_TORSO|LEGS|FEET
body_parts_covered = initial(body_parts_covered)
body_parts_covered &= ~(UPPER_TORSO|ARMS)
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
usr << "<span class='notice'>You roll down your [src].</span>"
else
body_parts_covered = initial(body_parts_covered)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll up your [src].</span>"
update_clothing_icon()
/obj/item/clothing/under/verb/rollsleeves()
set name = "Roll Up Sleeves"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
update_rollsleeves_status()
if(rolled_sleeves == -1)
usr << "<span class='notice'>You cannot roll up your [src]'s sleeves!</span>"
return
if(rolled_down == 1)
usr << "<span class='notice'>You must roll up your [src] first!</span>"
return
rolled_sleeves = !rolled_sleeves
if(rolled_sleeves)
body_parts_covered &= ~(ARMS)
item_state_slots[slot_w_uniform_str] = "[worn_state]_r"
usr << "<span class='notice'>You roll up your [src]'s sleeves.</span>"
else
body_parts_covered = initial(body_parts_covered)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>"
update_clothing_icon()
/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)

View File

@@ -1,11 +1,24 @@
///////////////////////////////////////////////////////////////////////
//Glasses
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
SEE_OBJS // can see all objs, no matter what
SEE_TURFS // can see all turfs (and areas), no matter what
SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are
// in a lit area (via pixel_x,y or smooth movement), can see those pixels
BLIND // can't see anything
*/
///////////////////////////////////////////////////////////////////////
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
//w_class = 2.0
//slot_flags = SLOT_EYES
//var/vision_flags = 0
//var/darkness_view = 0//Base human is 2
w_class = 2.0
slot_flags = SLOT_EYES
var/vision_flags = 0
var/darkness_view = 0//Base human is 2
var/see_invisible = -1
var/prescription = 0
var/toggleable = 0
var/off_state = "degoggles"
@@ -13,6 +26,16 @@
var/activation_sound = 'sound/items/goggles_charge.ogg'
var/obj/screen/overlay = null
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Teshari" = 'icons/mob/species/seromi/eyes.dmi'
)
/obj/item/clothing/glasses/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_glasses()
/obj/item/clothing/glasses/attack_self(mob/user)
if(toggleable)
if(active)
@@ -82,6 +105,21 @@
icon_state = "eyepatch"
item_state = "eyepatch"
body_parts_covered = 0
var/eye = null
/obj/item/clothing/glasses/eyepatch/verb/switcheye()
set name = "Switch Eyepatch"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
eye = !eye
if(eye)
icon_state = "[icon_state]_r"
else
icon_state = initial(icon_state)
update_clothing_icon()
/obj/item/clothing/glasses/monocle
name = "monocle"
@@ -146,6 +184,7 @@
icon_state = "welding-g"
item_state = "welding-g"
action_button_name = "Flip Welding Goggles"
matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000)
var/up = 0
/obj/item/clothing/glasses/welding/attack_self()
@@ -203,6 +242,12 @@
icon_state = "bigsunglasses"
item_state = "bigsunglasses"
/obj/item/clothing/glasses/fakesunglasses //Sunglasses without flash immunity
desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes."
name = "stylish sunglasses"
icon_state = "sun"
item_state = "sunglasses"
/obj/item/clothing/glasses/sunglasses/sechud
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
@@ -262,6 +307,8 @@
name = "Thermoncle"
desc = "A monocle thermal."
icon_state = "thermoncle"
toggleable = 1
action_button_name = "Toggle Monocle"
flags = null //doesn't protect eyes because it's a monocle, duh
body_parts_covered = 0
@@ -272,6 +319,8 @@
icon_state = "eyepatch"
item_state = "eyepatch"
body_parts_covered = 0
toggleable = 1
action_button_name = "Toggle Eyepatch"
/obj/item/clothing/glasses/thermal/plain/jensen
name = "Optical Thermal Implants"

View File

@@ -11,7 +11,7 @@
icon_state = "petehat"
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Seromi" = 'icons/mob/species/seromi/head.dmi'
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
/obj/item/clothing/head/collectable/slime

View File

@@ -15,6 +15,7 @@
max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
w_class = 3
ear_protection = 1
/obj/item/clothing/head/helmet/riot
name = "riot helmet"

View File

@@ -272,3 +272,112 @@
desc = "An orange piece of cloth, worn on the head."
icon_state = "orange_bandana"
body_parts_covered = 0
//Hijabs
/obj/item/clothing/head/hijab
name = "black hijab"
desc = "A black veil that is wrapped to cover the head and chest"
icon_state = "hijab_black"
body_parts_covered = 0
flags_inv = BLOCKHAIR
/obj/item/clothing/head/hijab/white
name = "white hijab"
desc = "A white veil that is wrapped to cover the head and chest"
icon_state = "hijab_white"
/obj/item/clothing/head/hijab/aqua
name = "aqua hijab"
desc = "An aqua veil that is wrapped to cover the head and chest"
icon_state = "hijab_aqua"
/obj/item/clothing/head/hijab/blue
name = "blue hijab"
desc = "A blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_blue"
/obj/item/clothing/head/hijab/brown
name = "brown hijab"
desc = "A brown veil that is wrapped to cover the head and chest"
icon_state = "hijab_brown"
/obj/item/clothing/head/hijab/darkblue
name = "bark blue hijab"
desc = "A dark blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_darkblue"
/obj/item/clothing/head/hijab/darkred
name = "dark red hijab"
desc = "A dark red veil that is wrapped to cover the head and chest"
icon_state = "hijab_darkred"
/obj/item/clothing/head/hijab/green
name = "green hijab"
desc = "A green veil that is wrapped to cover the head and chest"
icon_state = "hijab_green"
/obj/item/clothing/head/hijab/grey
name = "grey hijab"
desc = "A grey veil that is wrapped to cover the head and chest"
icon_state = "hijab_grey"
/obj/item/clothing/head/hijab/lightblue
name = "light blue hijab"
desc = "A light blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightblue"
/obj/item/clothing/head/hijab/lightbrown
name = "light brown hijab"
desc = "A light brown veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightbrown"
/obj/item/clothing/head/hijab/lightgreen
name = "light green hijab"
desc = "A light green veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightgreen"
/obj/item/clothing/head/hijab/lightpurple
name = "light purple hijab"
desc = "A light purple veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightpurple"
/obj/item/clothing/head/hijab/lightred
name = "light red hijab"
desc = "A light red veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightred"
/obj/item/clothing/head/hijab/maroon
name = "maroon hijab"
desc = "A maroon veil that is wrapped to cover the head and chest"
icon_state = "hijab_maroon"
/obj/item/clothing/head/hijab/orange
name = "orange hijab"
desc = "An orange veil that is wrapped to cover the head and chest"
icon_state = "hijab_orange"
/obj/item/clothing/head/hijab/pink
name = "pink hijab"
desc = "A pink veil that is wrapped to cover the head and chest"
icon_state = "hijab_pink"
/obj/item/clothing/head/hijab/purple
name = "purple hijab"
desc = "A purple veil that is wrapped to cover the head and chest"
icon_state = "hijab_purple"
/obj/item/clothing/head/hijab/red
name = "red hijab"
desc = "A red veil that is wrapped to cover the head and chest"
icon_state = "hijab_red"
/obj/item/clothing/head/hijab/yellowgreen
name = "yellow green hijab"
desc = "A yellow green veil that is wrapped to cover the head and chest"
icon_state = "hijab_yellowgreen"
/obj/item/clothing/head/hijab/yellow
name = "yellow hijab"
desc = "A yellow veil that is wrapped to cover the head and chest"
icon_state = "hijab_yellow"

View File

@@ -21,7 +21,7 @@
name = "mounted grenade launcher"
desc = "A shoulder-mounted micro-explosive dispenser."
selectable = 1
icon_state = "grenade"
icon_state = "grenadelauncher"
interface_name = "integrated grenade launcher"
interface_desc = "Discharges loaded grenades against the wearer's location."
@@ -117,7 +117,7 @@
if(!target)
gun.attack_self(holder.wearer)
return 1
return
gun.Fire(target,holder.wearer)
return 1

View File

@@ -38,6 +38,7 @@
interface_desc = "A self-sustaining plasma arc capable of cutting through walls."
suit_overlay_active = "plasmacutter"
suit_overlay_inactive = "plasmacutter"
use_power_cost = 0.5
device_type = /obj/item/weapon/pickaxe/plasmacutter
@@ -58,6 +59,7 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
use_power_cost = 0.1
device_type = /obj/item/weapon/pickaxe/diamonddrill

View File

@@ -1,6 +1,6 @@
/obj/item/clothing/head/helmet/space/rig/ert
light_overlay = "helmet_light_dual"
camera_networks = list("ERT")
camera_networks = list(NETWORK_ERT)
/obj/item/weapon/rig/ert
name = "ERT-C hardsuit control module"

View File

@@ -40,7 +40,7 @@
airtight = 0
seal_delay = 5 //not being vaccum-proof has an upside I guess
helm_type = /obj/item/clothing/head/lightrig/hacker
chest_type = /obj/item/clothing/suit/lightrig/hacker
glove_type = /obj/item/clothing/gloves/lightrig/hacker

View File

@@ -1,23 +1,23 @@
/obj/item/clothing/head/helmet/space/rig/industrial
camera_networks = list("Mine")
camera_networks = list(NETWORK_MINE)
/obj/item/clothing/head/helmet/space/rig/ce
camera_networks = list("Engineering")
camera_networks = list(NETWORK_ENGINEERING)
/obj/item/clothing/head/helmet/space/rig/eva
light_overlay = "helmet_light_dual"
camera_networks = list("Engineering")
camera_networks = list(NETWORK_ENGINEERING)
/obj/item/clothing/head/helmet/space/rig/hazmat
light_overlay = "hardhat_light"
camera_networks = list("Research")
camera_networks = list(NETWORK_RESEARCH)
/obj/item/clothing/head/helmet/space/rig/medical
camera_networks = list("Medbay")
camera_networks = list(NETWORK_MEDICAL)
/obj/item/clothing/head/helmet/space/rig/hazard
light_overlay = "helmet_light_dual"
camera_networks = list("Security")
camera_networks = list(NETWORK_SECURITY)
/obj/item/weapon/rig/internalaffairs
name = "augmented tie"

View File

@@ -57,11 +57,12 @@
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any.
var/obj/item/weapon/tank/tank = null // Deployable tank, if any.
var/obj/item/device/suit_cooling_unit/cooler = null// Cooling unit, for FBPs. Cannot be installed alongside a tank.
/obj/item/clothing/suit/space/void/examine(user)
..(user)
var/list/part_list = new
for(var/obj/item/I in list(helmet,boots,tank))
for(var/obj/item/I in list(helmet,boots,tank,cooler))
part_list += "\a [I]"
user << "\The [src] has [english_list(part_list)] installed."
if(tank && in_range(src,user))
@@ -102,6 +103,13 @@
M << "The valve on your suit's installed tank safely engages."
tank.canremove = 0
if(cooler)
if(H.s_store) //Ditto
M << "Alarmingly, the cooling unit installed into your suit fails to deploy."
else if (H.equip_to_slot_if_possible(cooler, slot_s_store))
M << "Your suit's cooling unit deploys."
cooler.canremove = 0
/obj/item/clothing/suit/space/void/dropped()
..()
@@ -128,6 +136,10 @@
tank.canremove = 1
tank.forceMove(src)
if(cooler)
cooler.canremove = 1
cooler.forceMove(src)
/obj/item/clothing/suit/space/void/verb/toggle_helmet()
set name = "Toggle Helmet"
@@ -163,14 +175,14 @@
/obj/item/clothing/suit/space/void/verb/eject_tank()
set name = "Eject Voidsuit Tank"
set name = "Eject Voidsuit Tank/Cooler"
set category = "Object"
set src in usr
if(!istype(src.loc,/mob/living)) return
if(!tank)
usr << "There is no tank inserted."
if(!tank && !cooler)
usr << "There is no tank or cooling unit inserted."
return
var/mob/living/carbon/human/H = usr
@@ -179,10 +191,16 @@
if(H.stat) return
if(H.wear_suit != src) return
H << "<span class='info'>You press the emergency release, ejecting \the [tank] from your suit.</span>"
tank.canremove = 1
H.drop_from_inventory(tank)
src.tank = null
var/obj/item/removing = null
if(tank)
removing = tank
tank = null
else
removing = cooler
cooler = null
H << "<span class='info'>You press the emergency release, ejecting \the [removing] from your suit.</span>"
removing.canremove = 1
H.drop_from_inventory(removing)
/obj/item/clothing/suit/space/void/attackby(obj/item/W as obj, mob/user as mob)
@@ -194,13 +212,17 @@
if(istype(W,/obj/item/weapon/screwdriver))
if(helmet || boots || tank)
var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank)
var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank,cooler)
if(!choice) return
if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead
user << "You pop \the [tank] out of \the [src]'s storage compartment."
tank.forceMove(get_turf(src))
src.tank = null
else if(choice == cooler)
user << "You pop \the [cooler] out of \the [src]'s storage compartment."
cooler.forceMove(get_turf(src))
src.cooler = null
else if(choice == helmet)
user << "You detatch \the [helmet] from \the [src]'s helmet mount."
helmet.forceMove(get_turf(src))
@@ -233,6 +255,8 @@
else if(istype(W,/obj/item/weapon/tank))
if(tank)
user << "\The [src] already has an airtank installed."
else if(cooler)
user << "\The [src]'s suit cooling unit is in the way. Remove it first."
else if(istype(W,/obj/item/weapon/tank/phoron))
user << "\The [W] cannot be inserted into \the [src]'s storage compartment."
else
@@ -241,5 +265,16 @@
W.forceMove(src)
tank = W
return
else if(istype(W,/obj/item/device/suit_cooling_unit))
if(cooler)
user << "\The [src] already has a suit cooling unit installed."
else if(tank)
user << "\The [src]'s airtank is in the way. Remove it first."
else
user << "You insert \the [W] into \the [src]'s storage compartment."
user.drop_item()
W.forceMove(src)
cooler = W
return
..()

View File

@@ -277,6 +277,15 @@
armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
cold_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = UPPER_TORSO|LOWER_TORSO
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.6
/obj/item/clothing/suit/storage/vest/officer
name = "officer armor vest"
desc = "A simple kevlar plate carrier. This one has a security holobadge clipped to the chest."

View File

@@ -146,7 +146,7 @@
//Lawyer
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
name = "Blue Suit Jacket"
name = "blue suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_blue_open"
item_state = "suitjacket_blue_open"
@@ -155,17 +155,19 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/storage/lawyer/purpjacket
name = "Purple Suit Jacket"
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket
name = "purple suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_purp"
item_state = "suitjacket_purp"
icon_state = "suitjacket_purp_open"
item_state = "suitjacket_purp_open"
icon_open = "suitjacket_purp_open"
icon_closed = "suitjacket_purp"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
//Internal Affairs
/obj/item/clothing/suit/storage/toggle/internalaffairs
name = "Internal Affairs Jacket"
name = "black suit jacket"
desc = "A smooth black jacket."
icon_state = "ia_jacket_open"
item_state = "ia_jacket"

View File

@@ -97,20 +97,34 @@
..()
return
/obj/item/clothing/accessory/badge/warden
name = "warden's badge"
/obj/item/clothing/accessory/badge/holo/warden
name = "warden's holobadge"
desc = "A silver corporate security badge. Stamped with the words 'Warden.'"
icon_state = "silverbadge"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/hos
name = "head of security's badge"
/obj/item/clothing/accessory/badge/holo/hos
name = "head of security's holobadge"
desc = "An immaculately polished gold security badge. Labeled 'Head of Security.'"
icon_state = "goldbadge"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/detective
name = "detective's badge"
/obj/item/clothing/accessory/badge/holo/detective
name = "detective's holobadge"
desc = "An immaculately polished gold security badge on leather. Labeled 'Detective.'"
icon_state = "marshalbadge"
slot_flags = SLOT_TIE | SLOT_BELT
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/weapon/storage/box/holobadge/hos
name = "holobadge box"
desc = "A box claiming to contain holobadges."
New()
new /obj/item/clothing/accessory/badge/holo(src)
new /obj/item/clothing/accessory/badge/holo(src)
new /obj/item/clothing/accessory/badge/holo/warden(src)
new /obj/item/clothing/accessory/badge/holo/detective(src)
new /obj/item/clothing/accessory/badge/holo/detective(src)
new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/clothing/accessory/badge/holo/cord(src)
..()
return

View File

@@ -3,6 +3,7 @@
icon_state = "black"
item_state = "bl_suit"
worn_state = "black"
rolled_sleeves = 0
/obj/item/clothing/under/color/blackf
name = "feminine black jumpsuit"
@@ -16,18 +17,21 @@
icon_state = "blue"
item_state = "b_suit"
worn_state = "blue"
rolled_sleeves = 0
/obj/item/clothing/under/color/green
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
worn_state = "green"
rolled_sleeves = 0
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
icon_state = "grey"
item_state = "gy_suit"
worn_state = "grey"
rolled_sleeves = 0
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
@@ -37,30 +41,35 @@
worn_state = "orange"
has_sensor = 2
sensor_mode = 3
rolled_sleeves = 0
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
icon_state = "pink"
item_state = "p_suit"
worn_state = "pink"
rolled_sleeves = 0
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
worn_state = "red"
rolled_sleeves = 0
/obj/item/clothing/under/color/white
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
worn_state = "white"
rolled_sleeves = 0
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
worn_state = "yellow"
rolled_sleeves = 0
/obj/item/clothing/under/psyche
name = "psychedelic jumpsuit"
@@ -75,6 +84,7 @@
icon_state = "lightblue"
item_state = "b_suit"
worn_state = "lightblue"
rolled_sleeves = 0
/obj/item/clothing/under/aqua
name = "aqua jumpsuit"
@@ -82,6 +92,7 @@
icon_state = "aqua"
item_state = "b_suit"
worn_state = "aqua"
rolled_sleeves = 0
/obj/item/clothing/under/purple
name = "purple jumpsuit"
@@ -89,6 +100,7 @@
icon_state = "purple"
item_state = "p_suit"
worn_state = "purple"
rolled_sleeves = 0
/obj/item/clothing/under/lightpurple
name = "lightpurple jumpsuit"
@@ -96,6 +108,7 @@
icon_state = "lightpurple"
item_state = "p_suit"
worn_state = "lightpurple"
rolled_sleeves = 0
/obj/item/clothing/under/lightgreen
name = "lightgreen jumpsuit"
@@ -103,6 +116,7 @@
icon_state = "lightgreen"
item_state = "g_suit"
worn_state = "lightgreen"
rolled_sleeves = 0
/obj/item/clothing/under/lightbrown
name = "lightbrown jumpsuit"
@@ -110,6 +124,7 @@
icon_state = "lightbrown"
item_state = "lb_suit"
worn_state = "lightbrown"
rolled_sleeves = 0
/obj/item/clothing/under/brown
name = "brown jumpsuit"
@@ -117,6 +132,7 @@
icon_state = "brown"
item_state = "lb_suit"
worn_state = "brown"
rolled_sleeves = 0
/obj/item/clothing/under/yellowgreen
name = "yellowgreen jumpsuit"
@@ -124,6 +140,7 @@
icon_state = "yellowgreen"
item_state = "y_suit"
worn_state = "yellowgreen"
rolled_sleeves = 0
/obj/item/clothing/under/darkblue
name = "darkblue jumpsuit"
@@ -131,6 +148,7 @@
icon_state = "darkblue"
item_state = "b_suit"
worn_state = "darkblue"
rolled_sleeves = 0
/obj/item/clothing/under/lightred
name = "lightred jumpsuit"
@@ -138,6 +156,7 @@
icon_state = "lightred"
item_state = "r_suit"
worn_state = "lightred"
rolled_sleeves = 0
/obj/item/clothing/under/darkred
name = "darkred jumpsuit"
@@ -145,3 +164,4 @@
icon_state = "darkred"
item_state = "r_suit"
worn_state = "darkred"
rolled_sleeves = 0

View File

@@ -6,6 +6,7 @@
icon_state = "ba_suit"
item_state = "ba_suit"
worn_state = "ba_suit"
rolled_sleeves = 0
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
@@ -14,6 +15,7 @@
icon_state = "captain"
item_state = "b_suit"
worn_state = "captain"
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo
@@ -22,6 +24,7 @@
icon_state = "qm"
item_state = "lb_suit"
worn_state = "qm"
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt"
@@ -29,6 +32,7 @@
icon_state = "qmf"
worn_state = "qmf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargo/jeans
name = "quartermaster's jumpjeans"
@@ -41,6 +45,7 @@
desc = "Jeeeaaans! They're comfy!"
icon_state = "qmjf"
worn_state = "qmjf"
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech
name = "cargo technician's jumpsuit"
@@ -49,18 +54,21 @@
item_state = "lb_suit"
worn_state = "cargo"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargotech/skirt
name = "cargo technician's jumpskirt"
desc = "Skirrrrrts! They're comfy and easy to wear!"
icon_state = "cargof"
worn_state = "cargof"
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech/jeans
name = "cargo technician's jumpjeans"
desc = "Jeeeaaans! They're comfy!"
icon_state = "cargoj"
worn_state = "cargoj"
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech/jeans/female
name = "cargo technician's jumpjeans"
@@ -75,6 +83,7 @@
icon_state = "chaplain"
item_state = "bl_suit"
worn_state = "chapblack"
rolled_sleeves = 0
/obj/item/clothing/under/rank/chef
@@ -83,6 +92,7 @@
icon_state = "chef"
item_state = "w_suit"
worn_state = "chef"
rolled_sleeves = 0
/obj/item/clothing/under/rank/clown
@@ -91,6 +101,7 @@
icon_state = "clown"
item_state = "clown"
worn_state = "clown"
rolled_sleeves = -1
/obj/item/clothing/under/rank/head_of_personnel
@@ -99,6 +110,7 @@
icon_state = "hop"
item_state = "b_suit"
worn_state = "hop"
rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_personnel_whimsy
desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does."
@@ -106,6 +118,7 @@
icon_state = "hopwhimsy"
item_state = "b_suit"
worn_state = "hopwhimsy"
rolled_sleeves = -1
/obj/item/clothing/under/rank/hydroponics
@@ -115,6 +128,7 @@
item_state = "g_suit"
worn_state = "hydroponics"
permeability_coefficient = 0.50
rolled_sleeves = 0
/obj/item/clothing/under/rank/internalaffairs
@@ -123,6 +137,7 @@
icon_state = "internalaffairs"
item_state = "ba_suit"
worn_state = "internalaffairs"
rolled_sleeves = 0
/obj/item/clothing/under/rank/janitor
@@ -132,6 +147,7 @@
worn_state = "janitor"
item_state = "janitor"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/lawyer
@@ -209,3 +225,4 @@
icon_state = "miner"
item_state = "lb_suit"
worn_state = "miner"
rolled_sleeves = 0

View File

@@ -6,6 +6,7 @@
item_state = "g_suit"
worn_state = "chief"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
@@ -13,6 +14,7 @@
icon_state = "chieff"
worn_state = "chieff"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -20,6 +22,7 @@
icon_state = "atmos"
item_state = "atmos_suit"
worn_state = "atmos"
rolled_sleeves = 0
/obj/item/clothing/under/rank/atmospheric_technician/skirt
desc = "It's a jumpskirt worn by atmospheric technicians."
@@ -27,6 +30,7 @@
icon_state = "atmosf"
worn_state = "atmosf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -35,6 +39,7 @@
item_state = "engi_suit"
worn_state = "engine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
rolled_sleeves = 0
/obj/item/clothing/under/rank/engineer/skirt
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
@@ -42,6 +47,7 @@
icon_state = "enginef"
worn_state = "enginef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work."
@@ -49,9 +55,11 @@
icon_state = "robotics"
item_state = "bl_suit"
worn_state = "robotics"
rolled_sleeves = 0
/obj/item/clothing/under/rank/roboticist/skirt
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
worn_state = "roboticsf"
rolled_sleeves = -1

View File

@@ -34,12 +34,14 @@
worn_state = "sciencewhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/scientist/skirt
name = "scientist's jumpskirt"
icon_state = "sciencewhitef"
worn_state = "sciencewhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
@@ -49,12 +51,14 @@
worn_state = "chemistrywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chemist/skirt
name = "chemist's jumpskirt"
icon_state = "chemistrywhitef"
worn_state = "chemistrywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/*
* Medical
@@ -67,6 +71,7 @@
worn_state = "cmo"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_medical_officer/skirt
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
@@ -74,6 +79,7 @@
icon_state = "cmof"
worn_state = "cmof"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -83,12 +89,14 @@
worn_state = "geneticswhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/geneticist/skirt
name = "geneticist's jumpskirt"
icon_state = "geneticswhitef"
worn_state = "geneticswhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -98,12 +106,14 @@
worn_state = "virologywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/virologist/skirt
name = "virologist's jumpskirt"
icon_state = "virologywhitef"
worn_state = "virologywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
@@ -114,6 +124,7 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
rolled_sleeves = -1
/obj/item/clothing/under/rank/nurse
desc = "A dress commonly worn by the nursing staff in the medical department."
@@ -124,6 +135,7 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
rolled_sleeves = -1
/obj/item/clothing/under/rank/orderly
desc = "A white suit to be worn by medical attendants."
@@ -133,6 +145,7 @@
worn_state = "orderly"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
@@ -142,12 +155,14 @@
worn_state = "medical"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/medical/skirt
name = "medical doctor's jumpskirt"
icon_state = "medicalf"
worn_state = "medicalf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/paramedic
name = "short sleeve medical jumpsuit"
@@ -155,13 +170,15 @@
icon_state = "medical_short"
item_state = "medical_short"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/blue
/obj/item/clothing/under/rank/medical/blue //Why are these not /obj/item/clothing/under/rank/medical/scrubs/ ?
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_state = "b_suit"
worn_state = "scrubsblue"
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
@@ -169,6 +186,7 @@
icon_state = "scrubsgreen"
item_state = "g_suit"
worn_state = "scrubsgreen"
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
@@ -176,6 +194,7 @@
icon_state = "scrubspurple"
item_state = "p_suit"
worn_state = "scrubspurple"
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/black
name = "medical scrubs"
@@ -183,6 +202,7 @@
icon_state = "scrubsblack"
item_state = "bl_suit"
worn_state = "scrubsblack"
rolled_sleeves = -1
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
@@ -197,6 +217,7 @@
icon_state = "psychturtle"
item_state = "b_suit"
worn_state = "psychturtle"
rolled_sleeves = 0
/*
@@ -210,6 +231,7 @@
worn_state = "genetics_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chemist_new
desc = "It's made of a special fiber which provides minor protection against biohazards."
@@ -219,6 +241,7 @@
worn_state = "chemist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/scientist_new
desc = "Made of a special fiber that gives special protection against biohazards and small explosions."
@@ -228,6 +251,7 @@
worn_state = "scientist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/virologist_new
desc = "Made of a special fiber that gives increased protection against biohazards."
@@ -236,4 +260,5 @@
item_state = "w_suit"
worn_state = "virologist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0

View File

@@ -16,6 +16,7 @@
worn_state = "warden"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
/obj/item/clothing/head/helmet/warden
name = "warden's hat"
@@ -31,6 +32,7 @@
worn_state = "secred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
/obj/item/clothing/under/rank/dispatch
name = "dispatcher's uniform"
@@ -50,16 +52,19 @@
worn_state = "redshirt2"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
/obj/item/clothing/under/rank/security/corp
icon_state = "sec_corporate"
//item_state = "sec_corporate"
worn_state = "sec_corporate"
rolled_sleeves = -1
/obj/item/clothing/under/rank/warden/corp
icon_state = "warden_corporate"
//item_state = "warden_corporate"
worn_state = "warden_corporate"
rolled_sleeves = -1
/obj/item/clothing/under/tactical
name = "tactical jumpsuit"
@@ -69,6 +74,7 @@
worn_state = "swatunder"
armor = list(melee = 10, bullet = 5, laser = 5,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = -1
/*
* Detective
@@ -81,7 +87,9 @@
worn_state = "detective"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
/*
/obj/item/clothing/under/det/verb/rollup()
set name = "Roll Suit Sleeves"
set category = "Object"
@@ -91,7 +99,7 @@
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform(1)
H << "<span class='notice'>You roll the sleeves of your shirt [unrolled ? "up" : "down"]</span>"
*/
/obj/item/clothing/under/det/grey
icon_state = "detective2"
worn_state = "detective2"
@@ -119,6 +127,7 @@
icon_state = "detective2_waistcoat"
worn_state = "detective2_waistcoat"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
/obj/item/clothing/head/det
name = "fedora"
@@ -149,11 +158,13 @@
worn_state = "hosred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.8
rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_security/corp
icon_state = "hos_corporate"
//item_state = "hos_corporate"
worn_state = "hos_corporate"
rolled_sleeves = -1
/obj/item/clothing/head/helmet/HoS
name = "Head of Security Hat"
@@ -186,6 +197,7 @@
item_state = "jensen"
worn_state = "jensen"
siemens_coefficient = 0.6
rolled_sleeves = -1
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
@@ -206,6 +218,7 @@
icon_state = "officerblueclothes"
item_state = "ba_suit"
worn_state = "officerblueclothes"
rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_security/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security."
@@ -213,6 +226,7 @@
icon_state = "hosblueclothes"
item_state = "ba_suit"
worn_state = "hosblueclothes"
rolled_sleeves = 0
/obj/item/clothing/under/rank/warden/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
@@ -220,3 +234,4 @@
icon_state = "wardenblueclothes"
item_state = "ba_suit"
worn_state = "wardenblueclothes"
rolled_sleeves = 0

View File

@@ -32,6 +32,7 @@
icon_state = "sl_suit"
worn_state = "sl_suit"
item_state = "sl_suit"
rolled_sleeves = 0
/obj/item/clothing/under/waiter
name = "waiter's outfit"
@@ -39,6 +40,7 @@
icon_state = "waiter"
item_state = "waiter"
worn_state = "waiter"
rolled_sleeves = 0
/obj/item/clothing/under/rank/mailman
name = "mailman's jumpsuit"
@@ -46,6 +48,7 @@
icon_state = "mailman"
item_state = "b_suit"
worn_state = "mailman"
rolled_sleeves = 0
/obj/item/clothing/under/sexyclown
name = "sexy-clown suit"
@@ -54,6 +57,7 @@
item_state = "clown"
worn_state = "sexyclown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
rolled_sleeves = -1 //Please never
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
@@ -106,6 +110,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | ARMS //Needs gloves and shoes with cold protection to be fully protected.
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
rolled_sleeves = 0
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
@@ -162,6 +167,7 @@
icon_state = "gentlesuit"
item_state = "gy_suit"
worn_state = "gentlesuit"
rolled_sleeves = 0
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
@@ -265,6 +271,7 @@
item_state = "w_suit"
worn_state = "sexymime"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
rolled_sleeves = -1 //Please never
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
@@ -551,6 +558,7 @@
icon_state = "mechanic"
item_state = "lb_suit"
worn_state = "mechanic"
rolled_sleeves = 0
/obj/item/clothing/under/cheongsam
name = "white cheongsam"

View File

@@ -25,5 +25,4 @@
item_state = "bl_suit"
worn_state = "tactifool"
siemens_coefficient = 1
rolled_sleeves = 0

View File

@@ -4,7 +4,8 @@
icon = 'icons/obj/clothing/species/seromi/uniform.dmi'
icon_state = "seromi_grey"
worn_state = "seromi_grey"
species_restricted = list("Seromi")
species_restricted = list("Teshari")
body_parts_covered = 0 // It's a thin piece of cloth with a neck hole.
/obj/item/clothing/under/seromi/white
name = "small white smock"
@@ -24,7 +25,7 @@
/obj/item/clothing/under/seromi/medical
name = "small Medical uniform"
icon_state = "seromi_medical"
worn_state = "Seromi_medical"
worn_state = "Teshari_medical"
/obj/item/clothing/under/seromi/rainbow
name = "small rainbow smock"

View File

@@ -143,7 +143,7 @@
return
if(!on_fire && istype(A) && (src in user))
if(A.is_open_container())
if(A.is_open_container() && !(A in user))
remove_contents(user, A)
else if(!ismob(A)) //mobs are handled in attack() - this prevents us from wiping down people while smothering them.
wipe_down(A, user)

View File

@@ -24,7 +24,6 @@
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
storage_slots = 6
/obj/item/weapon/storage/box/evidence/New()
..()

View File

@@ -5,6 +5,7 @@
slot_flags = SLOT_BELT
w_class = 2
item_state = "electronic"
action_button_name = "Toggle UV light"
matter = list(DEFAULT_WALL_MATERIAL = 150)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)

View File

@@ -20,33 +20,24 @@
if(istype(W, /obj/item/weapon/spacecash))
if(istype(W, /obj/item/weapon/spacecash/ewallet)) return 0
var/obj/item/weapon/spacecash/bundle/bundle
if(!istype(W, /obj/item/weapon/spacecash/bundle))
var/obj/item/weapon/spacecash/cash = W
user.drop_from_inventory(cash)
bundle = new (src.loc)
bundle.worth += cash.worth
qdel(cash)
else //is bundle
bundle = W
bundle.worth += src.worth
bundle.update_icon()
var/obj/item/weapon/spacecash/SC = W
SC.worth += src.worth
SC.update_icon()
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/h_user = user
h_user.drop_from_inventory(src)
h_user.drop_from_inventory(bundle)
h_user.put_in_hands(bundle)
user << "<span class='notice'>You add [src.worth] Thalers worth of money to the bundles.<br>It holds [bundle.worth] Thalers now.</span>"
h_user.drop_from_inventory(SC)
h_user.put_in_hands(SC)
user << "<span class='notice'>You combine the Thalers to a bundle of [SC.worth] Thalers.</span>"
qdel(src)
/obj/item/weapon/spacecash/bundle
name = "pile of thalers"
icon_state = ""
desc = "They are worth 0 Thalers."
worth = 0
/obj/item/weapon/spacecash/bundle/update_icon()
/obj/item/weapon/spacecash/update_icon()
overlays.Cut()
name = "[worth] Thaler\s"
if(worth in list(1000,500,200,100,50,20,10,1))
icon_state = "spacecash[worth]"
desc = "It's worth [worth] Thalers."
return
var/sum = src.worth
var/num = 0
for(var/i in list(1000,500,200,100,50,20,10,1))
@@ -68,7 +59,7 @@
src.overlays += banknote
src.desc = "They are worth [worth] Thalers."
/obj/item/weapon/spacecash/bundle/attack_self()
/obj/item/weapon/spacecash/attack_self()
var/amount = input(usr, "How many Thalers do you want to take? (0 to [src.worth])", "Take Money", 20) as num
amount = round(Clamp(amount, 0, src.worth))
if(amount==0) return 0
@@ -82,10 +73,10 @@
var/obj/cash = new cashtype (usr.loc)
usr.put_in_hands(cash)
else
var/obj/item/weapon/spacecash/bundle/bundle = new (usr.loc)
bundle.worth = amount
bundle.update_icon()
usr.put_in_hands(bundle)
var/obj/item/weapon/spacecash/SC = new (usr.loc)
SC.worth = amount
SC.update_icon()
usr.put_in_hands(SC)
if(!worth)
qdel(src)
@@ -138,17 +129,11 @@
worth = 1000
proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
if(sum in list(1000,500,200,100,50,20,10,1))
var/cash_type = text2path("/obj/item/weapon/spacecash/c[sum]")
var/obj/cash = new cash_type (usr.loc)
if(ishuman(human_user) && !human_user.get_active_hand())
human_user.put_in_hands(cash)
else
var/obj/item/weapon/spacecash/bundle/bundle = new (spawnloc)
bundle.worth = sum
bundle.update_icon()
if (ishuman(human_user) && !human_user.get_active_hand())
human_user.put_in_hands(bundle)
var/obj/item/weapon/spacecash/SC = new (spawnloc)
SC.worth = sum
SC.update_icon()
if (ishuman(human_user) && !human_user.get_active_hand())
human_user.put_in_hands(SC)
return
/obj/item/weapon/spacecash/ewallet
@@ -156,6 +141,9 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
icon_state = "efundcard"
desc = "A card that holds an amount of money."
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
attack_self() return //Don't act
attackby() return //like actual
update_icon() return //space cash
/obj/item/weapon/spacecash/ewallet/examine(mob/user)
..(user)

View File

@@ -0,0 +1,471 @@
/obj/machinery/cash_register
name = "cash register"
desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "register_idle"
flags = NOBLUDGEON
req_access = list(access_heads)
anchored = 1
var/locked = 1
var/cash_locked = 1
var/cash_open = 0
var/machine_id = ""
var/transaction_amount = 0 // cumulatd amount of money to pay in a single purchase
var/transaction_purpose = null // text that gets used in ATM transaction logs
var/list/transaction_logs = list() // list of strings using html code to visualise data
var/list/item_list = list() // entities and according
var/list/price_list = list() // prices for each purchase
var/manipulating = 0
var/cash_stored = 0
var/obj/item/confirm_item
var/datum/money_account/linked_account
var/account_to_connect = null
// Claim machine ID
/obj/machinery/cash_register/New()
machine_id = "[station_name()] RETAIL #[num_financial_terminals++]"
cash_stored = rand(10, 70)*10
transaction_devices += src // Global reference list to be properly set up by /proc/setup_economy()
/obj/machinery/cash_register/examine(mob/user as mob)
..(user)
if(cash_open)
if(cash_stored)
user << "It holds [cash_stored] Thaler\s of money."
else
user << "It's completely empty."
/obj/machinery/cash_register/attack_hand(mob/user as mob)
// Don't be accessible from the wrong side of the machine
if(get_dir(src, user) & reverse_dir[src.dir]) return
if(cash_open)
if(cash_stored)
spawn_money(cash_stored, loc, user)
cash_stored = 0
overlays -= "register_cash"
else
open_cash_box()
// Reset if necessary
else if(transaction_amount)
reset_memory()
user << "<span class='notice'>You reset the machine's memory.</span>"
else
custom_interface(user)
/obj/machinery/cash_register/AltClick(mob/user)
if(Adjacent(user))
open_cash_box()
/obj/machinery/cash_register/proc/custom_interface(mob/user as mob)
var/dat = "<h2>Retail Scanner<hr></h2>"
if (locked)
dat += "<a href='?src=\ref[src];choice=toggle_lock'>Unlock</a><br>"
dat += "Linked account: <b>[linked_account ? linked_account.owner_name : "None"]</b><br>"
dat += "<b>[cash_locked? "Unlock" : "Lock"] Cash Box</b> | "
else
dat += "<a href='?src=\ref[src];choice=toggle_lock'>Lock</a><br>"
dat += "Linked account: <a href='?src=\ref[src];choice=link_account'>[linked_account ? linked_account.owner_name : "None"]</a><br>"
dat += "<a href='?src=\ref[src];choice=toggle_cash_lock'>[cash_locked? "Unlock" : "Lock"] Cash Box</a> | "
dat += "<a href='?src=\ref[src];choice=custom_order'>Custom Order</a><hr>"
for(var/i=1, i<=transaction_logs.len, i++)
dat += "[transaction_logs[i]]<br>"
if(transaction_logs.len)
dat += locked ? "<br>" : "<a href='?src=\ref[src];choice=reset_log'>Reset Log</a><br>"
dat += "<br>"
dat += "<i>Device ID:</i> [machine_id]"
user << browse(dat, "window=retail;size=350x500")
/obj/machinery/cash_register/Topic(var/href, var/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("toggle_lock")
if(allowed(usr))
locked = !locked
else
usr << "\icon[src]<span class='warning'>Insufficient access.</span>"
if("toggle_cash_lock")
cash_locked = !cash_locked
if("link_account")
var/attempt_account_num = input("Enter account number", "New account number") as num
var/attempt_pin = input("Enter PIN", "Account PIN") as num
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
src.visible_message("\icon[src]<span class='warning'>Account has been suspended.</span>")
else
usr << "\icon[src]<span class='warning'>Account not found.</span>"
if("custom_order")
var/t_purpose = sanitize(input("Enter purpose", "New purpose") as text)
if (!t_purpose || !Adjacent(usr)) return
transaction_purpose = t_purpose
item_list += t_purpose
var/t_amount = input("Enter price", "New price") as num
if (!t_amount || !Adjacent(usr)) return
transaction_amount += t_amount
price_list += t_amount
playsound(src, 'sound/machines/twobeep.ogg', 25)
src.visible_message("\icon[src][transaction_purpose]: [transaction_amount] Thaler\s.")
if("reset_log")
transaction_logs.Cut()
usr << "\icon[src]<span class='notice'>Transaction log reset.</span>"
custom_interface(usr)
/obj/machinery/cash_register/attackby(obj/O as obj, user as mob)
// Check for a method of paying (ID, PDA, e-wallet, cash, ect.)
var/obj/item/weapon/card/id/I = O.GetID()
if(I)
scan_card(I, O)
else if (istype(O, /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/E = O
scan_wallet(E)
else if (istype(O, /obj/item/weapon/spacecash))
var/obj/item/weapon/spacecash/SC = O
if(cash_open)
user << "You neatly sort the cash into the box."
cash_stored += SC.worth
overlays |= "register_cash"
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.drop_from_inventory(SC)
qdel(SC)
else
scan_cash(SC)
else if(istype(O, /obj/item/weapon/card/emag))
return ..()
else if(istype(O, /obj/item/weapon/wrench))
var/obj/item/weapon/wrench/W = O
toggle_anchors(W, user)
// Not paying: Look up price and add it to transaction_amount
else
scan_item_price(O)
/obj/machinery/cash_register/MouseDrop_T(atom/dropping, mob/user)
if(Adjacent(dropping) && Adjacent(user) && !user.stat)
attackby(dropping, user)
/obj/machinery/cash_register/proc/confirm(obj/item/I)
if(confirm_item == I)
return 1
else
confirm_item = I
src.visible_message("\icon[src]<b>Total price:</b> [transaction_amount] Thaler\s. Swipe again to confirm.")
playsound(src, 'sound/machines/twobeep.ogg', 25)
return 0
/obj/machinery/cash_register/proc/scan_card(obj/item/weapon/card/id/I, obj/item/ID_container)
if (!transaction_amount)
return
if(!confirm(I))
return
if (!linked_account)
usr.visible_message("\icon[src]<span class='warning'>Unable to connect to linked account.</span>")
return
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
usr << "\icon[src]<span class='warning'>The cash box is open.</span>"
return
// Access account for transaction
if(check_account())
var/datum/money_account/D = get_account(I.associated_account_number)
var/attempt_pin = ""
if(D && D.security_level)
attempt_pin = input("Enter PIN", "Transaction") as num
D = null
D = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!D)
src.visible_message("\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
else
if(D.suspended)
src.visible_message("\icon[src]<span class='warning'>Your account has been suspended.</span>")
else
if(transaction_amount > D.money)
src.visible_message("\icon[src]<span class='warning'>Not enough funds.</span>")
else
// Transfer the money
D.money -= transaction_amount
linked_account.money += transaction_amount
// Create log entry in client's account
var/datum/transaction/T = new()
T.target_name = "[linked_account.owner_name]"
T.purpose = transaction_purpose
T.amount = "([transaction_amount])"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
// Create log entry in owner's account
T = new()
T.target_name = D.owner_name
T.purpose = transaction_purpose
T.amount = "[transaction_amount]"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
// Save log
add_transaction_log(I.registered_name ? I.registered_name : "n/A", "ID Card", transaction_amount)
// Confirm and reset
transaction_complete()
/obj/machinery/cash_register/proc/scan_wallet(obj/item/weapon/spacecash/ewallet/E)
if (!transaction_amount)
return
if(!confirm(E))
return
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
usr << "\icon[src]<span class='warning'>The cash box is open.</span>"
return
// Access account for transaction
if(check_account())
if(transaction_amount > E.worth)
src.visible_message("\icon[src]<span class='warning'>Not enough funds.</span>")
else
// Transfer the money
E.worth -= transaction_amount
linked_account.money += transaction_amount
// Create log entry in owner's account
var/datum/transaction/T = new()
T.target_name = E.owner_name
T.purpose = transaction_purpose
T.amount = "[transaction_amount]"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
// Save log
add_transaction_log(E.owner_name, "E-Wallet", transaction_amount)
// Confirm and reset
transaction_complete()
/obj/machinery/cash_register/proc/scan_cash(obj/item/weapon/spacecash/SC)
if (!transaction_amount)
return
if(!confirm(SC))
return
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
usr << "\icon[src]<span class='warning'>The cash box is open.</span>"
return
if(transaction_amount > SC.worth)
src.visible_message("\icon[src]<span class='warning'>Not enough money.</span>")
else
// Insert cash into magical slot
SC.worth -= transaction_amount
SC.update_icon()
if(!SC.worth)
if(ishuman(SC.loc))
var/mob/living/carbon/human/H = SC.loc
H.drop_from_inventory(SC)
qdel(SC)
cash_stored += transaction_amount
// Save log
add_transaction_log("n/A", "Cash", transaction_amount)
// Confirm and reset
transaction_complete()
/obj/machinery/cash_register/proc/scan_item_price(obj/O)
if(!istype(O)) return
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
usr << "\icon[src]<span class='warning'>The cash box is open.</span>"
return
// First check if item has a valid price
var/price = O.get_item_cost()
if(isnull(price))
src.visible_message("\icon[src]<span class='warning'>Unable to find item in database.</span>")
return
// Call out item cost
src.visible_message("\icon[src]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
// Note the transaction purpose for later use
if(transaction_purpose)
transaction_purpose += "<br>"
transaction_purpose += "[O]: [price] Thaler\s"
transaction_amount += price
item_list += "[O]"
price_list += "[price] &thorn"
// Animation and sound
playsound(src, 'sound/machines/twobeep.ogg', 25)
// Reset confirmation
confirm_item = null
/obj/machinery/cash_register/proc/add_transaction_log(var/c_name, var/p_method, var/t_amount)
var/dat = {"
<head><style>
.tx-table {border: 1px solid black;}
.tx-title {text-align: center; background-color:#ddddff; font-weight: bold}
.tx-name {background-color: #bbbbee}
.tx-data {text-align: right; background-color: #ccccff;}
</head></style>
<table width=300>
<tr><td colspan="2" class="tx-title">Transaction #[transaction_logs.len+1]</td></tr>
<tr></tr>
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr>
</table>
<table width=300>
"}
for(var/i=1, i<=item_list.len, i++)
dat += "<tr><td class=\"tx-name\">[item_list[i]]</td><td class=\"tx-data\" width=50>[price_list[i]]</td></tr>"
dat += "<tr></tr><tr><td colspan=\"2\" class=\"tx-name\" style='text-align: right'><b>Total Amount: [transaction_amount] &thorn</b></td></tr>"
dat += "</table>"
transaction_logs += dat
/obj/machinery/cash_register/proc/check_account()
if (!linked_account)
usr.visible_message("\icon[src]<span class='warning'>Unable to connect to linked account.</span>")
return 0
if(linked_account.suspended)
src.visible_message("\icon[src]<span class='warning'>Connected account has been suspended.</span>")
return 0
return 1
/obj/machinery/cash_register/proc/transaction_complete()
/// Visible confirmation
playsound(src, 'sound/machines/chime.ogg', 25)
src.visible_message("\icon[src]<span class='notice'>Transaction complete.</span>")
flick("register_approve", src)
reset_memory()
/obj/machinery/cash_register/proc/reset_memory()
transaction_amount = null
transaction_purpose = ""
item_list.Cut()
price_list.Cut()
confirm_item = null
/obj/machinery/cash_register/verb/open_cash_box()
set category = "Object"
set name = "Open Cash Box"
set desc = "Open/closes the register's cash box."
set src in view(1)
if(usr.stat) return
if(cash_locked)
usr << "<span class='warning'>The cash box is locked.</span>"
else if(cash_open)
cash_open = 0
overlays -= "register_approve"
overlays -= "register_open"
overlays -= "register_cash"
else
cash_open = 1
overlays += "register_approve"
overlays += "register_open"
if(cash_stored)
overlays += "register_cash"
/obj/machinery/cash_register/proc/toggle_anchors(obj/item/weapon/wrench/W, mob/user)
if(manipulating) return
manipulating = 1
if(!anchored)
user.visible_message("\The [user] begins securing \the [src] to the floor.",
"You begin securing \the [src] to the floor.")
else
user.visible_message("<span class='warning'>\The [user] begins unsecuring \the [src] from the floor.</span>",
"You begin unsecuring \the [src] from the floor.")
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(!do_after(user, 20))
manipulating = 0
return
if(!anchored)
user.visible_message("<span class='notice'>\The [user] has secured \the [src] to the floor.</span>",
"<span class='notice'>You have secured \the [src] to the floor.</span>")
else
user.visible_message("<span class='warning'>\The [user] has unsecured \the [src] from the floor.</span>",
"<span class='notice'>You have unsecured \the [src] from the floor.</span>")
anchored = !anchored
manipulating = 0
return
/obj/machinery/cash_register/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
src.visible_message("<span class='danger'>The [src]'s cash box springs open as [user] swipes the card through the scanner!</span>")
playsound(src, "sparks", 50, 1)
req_access = list()
emagged = 1
locked = 0
cash_locked = 0
open_cash_box()
//--Premades--//
/obj/machinery/cash_register/command
account_to_connect = "Command"
..()
/obj/machinery/cash_register/medical
account_to_connect = "Medical"
..()
/obj/machinery/cash_register/engineering
account_to_connect = "Engineering"
..()
/obj/machinery/cash_register/science
account_to_connect = "Science"
..()
/obj/machinery/cash_register/security
account_to_connect = "Security"
..()
/obj/machinery/cash_register/cargo
account_to_connect = "Cargo"
..()
/obj/machinery/cash_register/civilian
account_to_connect = "Civilian"
..()

View File

@@ -50,6 +50,7 @@
/var/list/economic_species_modifier = list(
/datum/species/human = 10,
/datum/species/skrell = 12,
/datum/species/teshari = 9, // Skrell sponsored!
/datum/species/tajaran = 7,
/datum/species/unathi = 7,
/datum/species/vox = 1
@@ -80,6 +81,7 @@ var/global/list/datum/money_account/department_accounts = list()
var/global/num_financial_terminals = 1
var/global/next_account_number = 0
var/global/list/all_money_accounts = list()
var/global/list/transaction_devices = list()
var/global/economy_init = 0
/proc/setup_economy()
@@ -101,6 +103,13 @@ var/global/economy_init = 0
create_department_account("Vendor")
vendor_account = department_accounts["Vendor"]
for(var/obj/item/device/retail_scanner/RS in transaction_devices)
if(RS.account_to_connect)
RS.linked_account = department_accounts[RS.account_to_connect]
for(var/obj/machinery/cash_register/CR in transaction_devices)
if(CR.account_to_connect)
CR.linked_account = department_accounts[CR.account_to_connect]
current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [game_year]"
economy_init = 1

View File

@@ -0,0 +1,811 @@
// For convenience and easier comparing and maintaining of item prices,
// all these will be defined here and sorted in different sections.
// The item price in thalers. atom/movable so we can also assign a price to animals and other things.
/atom/movable/var/price_tag = null
// The proc that is called when the price is being asked for. Use this to refer to another object if necessary.
/atom/movable/proc/get_item_cost()
return price_tag
//***************//
//---Beverages---//
//***************//
/datum/reagent/var/price_tag = null
// Juices, soda and similar //
/datum/reagent/drink/juice
price_tag = 2
/datum/reagent/toxin/poisonberryjuice
price_tag = 2
/datum/reagent/drink/milk
price_tag = 2
/datum/reagent/drink/soda
price_tag = 2
/datum/reagent/drink/doctor_delight
price_tag = 2
/datum/reagent/drink/nothing
price_tag = 2
/datum/reagent/drink/milkshake
price_tag = 2
// Beer //
/datum/reagent/drink/ethanol/ale
price_tag = 2
/datum/reagent/drink/ethanol/beer
price_tag = 2
// Hot Drinks //
/datum/reagent/drink/rewriter
price_tag = 3
/datum/reagent/drink/tea
price_tag = 3
/datum/reagent/drink/coffee
price_tag = 3
/datum/reagent/drink/hot_coco
price_tag = 3
// Spirituous liquors //
/datum/reagent/drink/ethanol/irish_cream
price_tag = 5
/datum/reagent/drink/ethanol/absinthe
price_tag = 5
/datum/reagent/drink/ethanol/bluecuracao
price_tag = 5
/datum/reagent/drink/ethanol/deadrum
price_tag = 5
/datum/reagent/drink/ethanol/gin
price_tag = 5
/datum/reagent/drink/ethanol/coffee/kahlua
price_tag = 5
/datum/reagent/drink/ethanol/melonliquor
price_tag = 5
/datum/reagent/drink/ethanol/rum
price_tag = 5
/datum/reagent/drink/ethanol/tequilla
price_tag = 5
/datum/reagent/drink/ethanol/thirteenloko
price_tag = 5
/datum/reagent/drink/ethanol/vodka
price_tag = 5
/datum/reagent/drink/ethanol/whiskey
price_tag = 5
// Wines //
/datum/reagent/drink/ethanol/wine
price_tag = 8
/datum/reagent/drink/ethanol/cognac
price_tag = 8
/datum/reagent/drink/ethanol/sake
price_tag = 8
/datum/reagent/drink/ethanol/vermouth
price_tag = 8
/datum/reagent/drink/ethanol/pwine
price_tag = 8
// Cocktails //
/datum/reagent/drink/ethanol/acid_spit
price_tag = 4
/datum/reagent/drink/ethanol/alliescocktail
price_tag = 4
/datum/reagent/drink/ethanol/aloe
price_tag = 4
/datum/reagent/drink/ethanol/amasec
price_tag = 4
/datum/reagent/drink/ethanol/andalusia
price_tag = 4
/datum/reagent/drink/ethanol/antifreeze
price_tag = 4
/datum/reagent/drink/ethanol/atomicbomb
price_tag = 4
/datum/reagent/drink/ethanol/coffee/b52
price_tag = 4
/datum/reagent/drink/ethanol/bahama_mama
price_tag = 4
/datum/reagent/drink/ethanol/barefoot
price_tag = 4
/datum/reagent/drink/ethanol/beepsky_smash
price_tag = 4
/datum/reagent/drink/ethanol/bilk
price_tag = 4
/datum/reagent/drink/ethanol/black_russian
price_tag = 4
/datum/reagent/drink/ethanol/bloody_mary
price_tag = 4
/datum/reagent/drink/ethanol/booger
price_tag = 4
/datum/reagent/drink/ethanol/brave_bull
price_tag = 4
/datum/reagent/drink/ethanol/changeling_sting
price_tag = 4
/datum/reagent/drink/ethanol/martini
price_tag = 4
/datum/reagent/drink/ethanol/cuba_libre
price_tag = 4
/datum/reagent/drink/ethanol/demonsblood
price_tag = 4
/datum/reagent/drink/ethanol/devilskiss
price_tag = 4
/datum/reagent/drink/ethanol/driestmartini
price_tag = 4
/datum/reagent/drink/ethanol/ginfizz
price_tag = 4
/datum/reagent/drink/ethanol/grog
price_tag = 4
/datum/reagent/drink/ethanol/erikasurprise
price_tag = 4
/datum/reagent/drink/ethanol/gargleblaster
price_tag = 4
/datum/reagent/drink/ethanol/gintonic
price_tag = 4
/datum/reagent/drink/ethanol/goldschlager
price_tag = 4
/datum/reagent/drink/ethanol/hippies_delight
price_tag = 4
/datum/reagent/drink/ethanol/hooch
price_tag = 4
/datum/reagent/drink/ethanol/iced_beer
price_tag = 4
/datum/reagent/drink/ethanol/irishcarbomb
price_tag = 4
/datum/reagent/drink/ethanol/coffee/irishcoffee
price_tag = 4
/datum/reagent/drink/ethanol/longislandicedtea
price_tag = 4
/datum/reagent/drink/ethanol/manhattan
price_tag = 4
/datum/reagent/drink/ethanol/manhattan_proj
price_tag = 4
/datum/reagent/drink/ethanol/manly_dorf
price_tag = 4
/datum/reagent/drink/ethanol/margarita
price_tag = 4
/datum/reagent/drink/ethanol/mead
price_tag = 4
/datum/reagent/drink/ethanol/moonshine
price_tag = 4
/datum/reagent/drink/ethanol/neurotoxin
price_tag = 4
/datum/reagent/drink/ethanol/patron
price_tag = 4
/datum/reagent/drink/ethanol/red_mead
price_tag = 4
/datum/reagent/drink/ethanol/sbiten
price_tag = 4
/datum/reagent/drink/ethanol/screwdrivercocktail
price_tag = 4
/datum/reagent/drink/ethanol/silencer
price_tag = 4
/datum/reagent/drink/ethanol/singulo
price_tag = 4
/datum/reagent/drink/ethanol/snowwhite
price_tag = 4
/datum/reagent/drink/ethanol/suidream
price_tag = 4
/datum/reagent/drink/ethanol/syndicatebomb
price_tag = 4
/datum/reagent/drink/ethanol/tequillasunrise
price_tag = 4
/datum/reagent/drink/ethanol/threemileisland
price_tag = 4
/datum/reagent/drink/ethanol/toxins_special
price_tag = 4
/datum/reagent/drink/ethanol/vodkamartini
price_tag = 4
/datum/reagent/drink/ethanol/vodkatonic
price_tag = 4
/datum/reagent/drink/ethanol/white_russian
price_tag = 4
/datum/reagent/drink/ethanol/whiskey_cola
price_tag = 4
/datum/reagent/drink/ethanol/whiskeysoda
price_tag = 4
/datum/reagent/drink/ethanol/specialwhiskey
price_tag = 4
// Cocktails without alcohol //
/datum/reagent/drink/ethanol/bananahonk
price_tag = 3
// From the machine //
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
price_tag = 2
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
price_tag = 1
//***************//
//---Foodstuff---//
//***************//
// Snacks //
/obj/item/weapon/reagent_containers/food/snacks/candy
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sosjerky
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/tastybread
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/no_raisin
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/skrellsnacks
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/chips
price_tag = 1
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen
price_tag = 5
// Burger //
/obj/item/weapon/reagent_containers/food/snacks/brainburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/ghostburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/human/burger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/cheeseburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/monkeyburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/fishburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/tofuburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/roburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/roburgerbig
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/xenoburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/clownburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/mimeburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/spellburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/jellyburger
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/superbiteburger
price_tag = 8
// Sandwiches //
/obj/item/weapon/reagent_containers/food/snacks/sandwich
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/grilledcheese
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich
price_tag = 3
// Cookies and Candies //
/obj/item/weapon/reagent_containers/food/snacks/cookie
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/chocolateegg
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/candy_corn
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/donut
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/popcorn
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/candiedapple
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/chawanmushi
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/cracker
price_tag = 1
// Full meals //
/obj/item/weapon/reagent_containers/food/snacks/friedegg
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/tofurkey
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/fishfingers
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/omelette
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/waffles
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/eggplantparm
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/soylenviridians
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/wingfangchu
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/kabob
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/monkeykabob
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/tofukabob
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/cubancarp
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/fries
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/spagetti
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/cheesyfries
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/enchiladas
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/fishandchips
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/stew
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/boiledrice
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/ricepudding
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/spesslaw
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/carrotfries
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/appletart
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/margheritaslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/
// Baked Goods //
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/baguette
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/twobread
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/breadslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice
price_tag = 1
// Soups //
/obj/item/weapon/reagent_containers/food/snacks/meatballsoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/slimesoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/bloodsoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/clownstears
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/nettlesoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/mysterysoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/wishsoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/hotchili
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/coldchili
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/tomatosoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/milosoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup
price_tag = 3
/obj/item/weapon/reagent_containers/food/snacks/beetsoup
price_tag = 3
// Pies //
/obj/item/weapon/reagent_containers/food/snacks/pie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/meatpie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/tofupie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/plump_pie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/xemeatpie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/applepie
price_tag = 4
/obj/item/weapon/reagent_containers/food/snacks/cherrypie
price_tag = 4
// Cakes //
/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/braincakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/limecakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/applecakeslice
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
price_tag = 5
/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
price_tag = 1
// Misc //
/obj/item/weapon/reagent_containers/food/snacks/boiledegg
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/sausage
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/muffin
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/tossedsalad
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/validsalad
price_tag = 2
/obj/item/weapon/reagent_containers/food/snacks/dionaroast
price_tag = 25
/obj/item/pizzabox
get_item_cost()
return get_item_cost(pizza)

View File

@@ -0,0 +1,345 @@
/obj/item/device/retail_scanner
name = "retail scanner"
desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/device.dmi'
icon_state = "retail_idle"
flags = NOBLUDGEON
req_access = list(access_heads)
var/locked = 1
var/emagged = 0
var/machine_id = ""
var/transaction_amount = 0 // cumulatd amount of money to pay in a single purchase
var/transaction_purpose = null // text that gets used in ATM transaction logs
var/list/transaction_logs = list() // list of strings using html code to visualise data
var/list/item_list = list() // entities and according
var/list/price_list = list() // prices for each purchase
var/obj/item/confirm_item
var/datum/money_account/linked_account
var/account_to_connect = null
// Claim machine ID
/obj/item/device/retail_scanner/New()
machine_id = "[station_name()] RETAIL #[num_financial_terminals++]"
if(locate(/obj/structure/table) in loc)
pixel_y = 3
transaction_devices += src // Global reference list to be properly set up by /proc/setup_economy()
// Always face the user when put on a table
/obj/item/device/retail_scanner/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity) return
if(istype(AM, /obj/structure/table))
src.pixel_y = 3 // Shift it up slightly to look better on table
src.dir = get_dir(src, user)
else
scan_item_price(AM)
// Reset dir when picked back up
/obj/item/device/retail_scanner/pickup(mob/user)
src.dir = SOUTH
src.pixel_y = 0
/obj/item/device/retail_scanner/attack_self(mob/user as mob)
// Reset if necessary
if(transaction_amount)
reset_memory()
user << "<span class='notice'>You reset the device.</span>"
else
custom_interface(user)
/obj/item/device/retail_scanner/AltClick(var/mob/user)
if(Adjacent(user))
custom_interface(user)
/obj/item/device/retail_scanner/proc/custom_interface(mob/user as mob)
var/dat = "<h2>Retail Scanner<hr></h2>"
if (locked)
dat += "<a href='?src=\ref[src];choice=toggle_lock'>Unlock</a><br>"
dat += "Linked account: <b>[linked_account ? linked_account.owner_name : "None"]</b><br>"
else
dat += "<a href='?src=\ref[src];choice=toggle_lock'>Lock</a><br>"
dat += "Linked account: <a href='?src=\ref[src];choice=link_account'>[linked_account ? linked_account.owner_name : "None"]</a><br>"
dat += "<a href='?src=\ref[src];choice=custom_order'>Custom Order</a><hr>"
for(var/i=1, i<=transaction_logs.len, i++)
dat += "[transaction_logs[i]]<br>"
if(transaction_logs.len)
dat += locked ? "<br>" : "<a href='?src=\ref[src];choice=reset_log'>Reset Log</a><br>"
dat += "<br>"
dat += "<i>Device ID:</i> [machine_id]"
user << browse(dat, "window=retail;size=350x500")
/obj/item/device/retail_scanner/Topic(var/href, var/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("toggle_lock")
if(allowed(usr))
locked = !locked
else
usr << "\icon[src]<span class='warning'>Insufficient access.</span>"
if("link_account")
var/attempt_account_num = input("Enter account number", "New account number") as num
var/attempt_pin = input("Enter PIN", "Account PIN") as num
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
src.visible_message("\icon[src]<span class='warning'>Account has been suspended.</span>")
else
usr << "\icon[src]<span class='warning'>Account not found.</span>"
if("custom_order")
var/t_purpose = sanitize(input("Enter purpose", "New purpose") as text)
if (!t_purpose || !Adjacent(usr)) return
transaction_purpose = t_purpose
item_list += t_purpose
var/t_amount = input("Enter price", "New price") as num
if (!t_amount || !Adjacent(usr)) return
transaction_amount += t_amount
price_list += t_amount
playsound(src, 'sound/machines/twobeep.ogg', 25)
src.visible_message("\icon[src][transaction_purpose]: [transaction_amount] Thaler\s.")
if("reset_log")
transaction_logs.Cut()
usr << "\icon[src]<span class='notice'>Transaction log reset.</span>"
custom_interface(usr)
/obj/item/device/retail_scanner/attackby(obj/O as obj, user as mob)
// Check for a method of paying (ID, PDA, e-wallet, cash, ect.)
var/obj/item/weapon/card/id/I = O.GetID()
if(I)
scan_card(I, O)
else if (istype(O, /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/E = O
scan_wallet(E)
else if (istype(O, /obj/item/weapon/spacecash))
usr << "<span class='warning'>This device does not accept cash.</span>"
else if(istype(O, /obj/item/weapon/card/emag))
return ..()
// Not paying: Look up price and add it to transaction_amount
else
scan_item_price(O)
/obj/item/device/retail_scanner/proc/confirm(var/obj/item/I)
if(confirm_item == I)
return 1
else
confirm_item = I
src.visible_message("\icon[src]<b>Total price:</b> [transaction_amount] Thaler\s. Swipe again to confirm.")
playsound(src, 'sound/machines/twobeep.ogg', 25)
return 0
/obj/item/device/retail_scanner/proc/scan_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container)
if (!transaction_amount)
return
if(!confirm(I))
return
if (!linked_account)
usr.visible_message("\icon[src]<span class='warning'>Unable to connect to linked account.</span>")
return
// Access account for transaction
if(check_account())
var/datum/money_account/D = get_account(I.associated_account_number)
var/attempt_pin = ""
if(D && D.security_level)
attempt_pin = input("Enter PIN", "Transaction") as num
D = null
D = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!D)
src.visible_message("\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
else
if(D.suspended)
src.visible_message("\icon[src]<span class='warning'>Your account has been suspended.</span>")
else
if(transaction_amount > D.money)
src.visible_message("\icon[src]<span class='warning'>Not enough funds.</span>")
else
// Transfer the money
D.money -= transaction_amount
linked_account.money += transaction_amount
// Create log entry in client's account
var/datum/transaction/T = new()
T.target_name = "[linked_account.owner_name]"
T.purpose = transaction_purpose
T.amount = "([transaction_amount])"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
// Create log entry in owner's account
T = new()
T.target_name = D.owner_name
T.purpose = transaction_purpose
T.amount = "[transaction_amount]"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
// Save log
add_transaction_log(I.registered_name ? I.registered_name : "n/A", "ID Card", transaction_amount)
// Confirm and reset
transaction_complete()
/obj/item/device/retail_scanner/proc/scan_wallet(var/obj/item/weapon/spacecash/ewallet/E)
if (!transaction_amount)
return
if(!confirm(E))
return
// Access account for transaction
if(check_account())
if(transaction_amount > E.worth)
src.visible_message("\icon[src]<span class='warning'>Not enough funds.</span>")
else
// Transfer the money
E.worth -= transaction_amount
linked_account.money += transaction_amount
// Create log entry in owner's account
var/datum/transaction/T = new()
T.target_name = E.owner_name
T.purpose = transaction_purpose
T.amount = "[transaction_amount]"
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
// Save log
add_transaction_log(E.owner_name, "E-Wallet", transaction_amount)
// Confirm and reset
transaction_complete()
/obj/item/device/retail_scanner/proc/scan_item_price(var/obj/O)
if(!istype(O)) return
// First check if item has a valid price
var/price = O.get_item_cost()
if(isnull(price))
src.visible_message("\icon[src]<span class='warning'>Unable to find item in database.</span>")
return
// Call out item cost
src.visible_message("\icon[src]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
// Note the transaction purpose for later use
if(transaction_purpose)
transaction_purpose += "<br>"
transaction_purpose += "[O]: [price] Thaler\s"
transaction_amount += price
item_list += "[O]"
price_list += "[price] &thorn"
// Animation and sound
flick("retail_scan", src)
playsound(src, 'sound/machines/twobeep.ogg', 25)
// Reset confirmation
confirm_item = null
/obj/item/device/retail_scanner/proc/add_transaction_log(var/c_name, var/p_method, var/t_amount)
var/dat = {"
<head><style>
.tx-table {border: 1px solid black;}
.tx-title {text-align: center; background-color:#ddddff; font-weight: bold}
.tx-name {background-color: #bbbbee}
.tx-data {text-align: right; background-color: #ccccff;}
</head></style>
<table width=300>
<tr><td colspan="2" class="tx-title">Transaction #[transaction_logs.len+1]</td></tr>
<tr></tr>
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr>
</table>
<table width=300>
"}
for(var/i=1, i<=item_list.len, i++)
dat += "<tr><td class=\"tx-name\">[item_list[i]]</td><td class=\"tx-data\" width=50>[price_list[i]]</td></tr>"
dat += "<tr></tr><tr><td colspan=\"2\" class=\"tx-name\" style='text-align: right'><b>Total Amount: [transaction_amount] &thorn</b></td></tr>"
dat += "</table>"
transaction_logs += dat
/obj/item/device/retail_scanner/proc/check_account()
if (!linked_account)
usr.visible_message("\icon[src]<span class='warning'>Unable to connect to linked account.</span>")
return 0
if(linked_account.suspended)
src.visible_message("\icon[src]<span class='warning'>Connected account has been suspended.</span>")
return 0
return 1
/obj/item/device/retail_scanner/proc/transaction_complete()
/// Visible confirmation
playsound(src, 'sound/machines/chime.ogg', 25)
src.visible_message("\icon[src]<span class='notice'>Transaction complete.</span>")
flick("retail_approve", src)
reset_memory()
/obj/item/device/retail_scanner/proc/reset_memory()
transaction_amount = null
transaction_purpose = ""
item_list.Cut()
price_list.Cut()
confirm_item = null
/obj/item/device/retail_scanner/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
user << "<span class='danger'>You stealthily swipe the cryptographic sequencer through \the [src].</span>"
playsound(src, "sparks", 50, 1)
req_access = list()
emagged = 1
//--Premades--//
/obj/item/device/retail_scanner/command
account_to_connect = "Command"
..()
/obj/item/device/retail_scanner/medical
account_to_connect = "Medical"
..()
/obj/item/device/retail_scanner/engineering
account_to_connect = "Engineering"
..()
/obj/item/device/retail_scanner/science
account_to_connect = "Science"
..()
/obj/item/device/retail_scanner/security
account_to_connect = "Security"
..()
/obj/item/device/retail_scanner/cargo
account_to_connect = "Cargo"
..()
/obj/item/device/retail_scanner/civilian
account_to_connect = "Civilian"
..()

View File

@@ -1,44 +0,0 @@
/datum/event/disease_outbreak
announceWhen = 15
/datum/event/disease_outbreak/announce()
command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/datum/event/disease_outbreak/setup()
announceWhen = rand(15, 30)
/datum/event/disease_outbreak/start()
var/virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis)
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
var/foundAlready = 0 // don't infect someone that already has the virus
var/turf/T = get_turf(H)
if(!T)
continue
if(isNotStationLevel(T.z))
continue
for(var/datum/disease/D in H.viruses)
foundAlready = 1
if(H.stat == 2 || foundAlready)
continue
if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst.
continue
var/datum/disease/dnaspread/D = new
D.strain_data["name"] = H.real_name
D.strain_data["UI"] = H.dna.UI.Copy()
D.strain_data["SE"] = H.dna.SE.Copy()
D.carrier = 1
D.holder = H
D.affected_mob = H
H.viruses += D
break
else
var/datum/disease/D = new virus_type
D.carrier = 1
D.holder = H
D.affected_mob = H
H.viruses += D
break

View File

@@ -1,13 +1,4 @@
/datum/event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) if(H.client && H.stat != DEAD)
var/foundAlready = 0 //don't infect someone that already has the virus
for(var/datum/disease/D in H.viruses)
foundAlready = 1
if(H.stat == 2 || foundAlready)
continue
var/datum/disease/D = new /datum/disease/appendicitis
D.holder = H
D.affected_mob = H
H.viruses += D
break
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
if(H.client && H.appendicitis())
break

View File

@@ -49,10 +49,30 @@
if(flags & STOPPRESSUREDAMAGE)
armor_stats += "Wearing this will protect you from the vacuum of space. \n"
if(flags & THICKMATERIAL)
armor_stats += "The material is exceptionally thick. \n"
if(max_heat_protection_temperature == FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE)
armor_stats += "It provides very good protection against fire and heat. \n"
if(min_cold_protection_temperature == SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE)
armor_stats += "It provides very good protection against very cold temperatures. \n"
var/list/covers = list()
var/list/slots = list()
for(var/name in string_part_flags)
if(body_parts_covered & string_part_flags[name])
covers += name
for(var/name in string_slot_flags)
if(slot_flags & string_slot_flags[name])
slots += name
if(covers.len)
armor_stats += "It covers the [english_list(covers)]. \n"
if(slots.len)
armor_stats += "It can be worn on your [english_list(slots)]. \n"
return armor_stats

View File

@@ -39,4 +39,26 @@
You can also inject common medicines directly into their bloodstream.\
<br>\
Right-click the cell and click 'Eject Occupant' to remove them. You can enter the cell yourself by right clicking and selecting 'Enter Sleeper'. \
Note that you cannot control the sleeper while inside of it."
Note that you cannot control the sleeper while inside of it."
/obj/item/bodybag/cryobag
description_info = "This stasis bag will preserve the occupant, stopping most forms of harm from occuring, such as from oxygen \
deprivation, irradiation, shock, and chemicals inside the occupant, at least until the bag is opened again.<br>\
<br>\
Stasis bags can only be used once, and are rather costly, so use them well. They are ideal for situations where someone may die \
before being able to bring them back to safety, or if they are in a hostile enviroment, such as in vacuum or in a phoron leak, as \
the bag will protect the occupant from most outside enviromental hazards. If you open a bag by mistake, closing the bag with no \
occupant will not use up the bag, and you can pick it back up.<br>\
<br>\
You can use a health analyzer to scan the occupant's vitals without opening the bag by clicking the occupied bag with the analyzer."
/obj/structure/closet/body_bag/cryobag
description_info = "This stasis bag will preserve the occupant, stopping most forms of harm from occuring, such as from oxygen \
deprivation, irradiation, shock, and chemicals inside the occupant, at least until the bag is opened again.<br>\
<br>\
Stasis bags can only be used once, and are rather costly, so use them well. They are ideal for situations where someone may die \
before being able to bring them back to safety, or if they are in a hostile enviroment, such as in vacuum or in a phoron leak, as \
the bag will protect the occupant from most outside enviromental hazards. If you open a bag by mistake, closing the bag with no \
occupant will not use up the bag, and you can pick it back up.<br>\
<br>\
You can use a health analyzer to scan the occupant's vitals without opening the bag by clicking the occupied bag with the analyzer."

32
code/modules/games/cah.dm Normal file
View File

@@ -0,0 +1,32 @@
// This is a parody of Cards Against Humanity (https://en.wikipedia.org/wiki/Cards_Against_Humanity)
// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL:
// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode
/obj/item/weapon/deck/cah
name = "\improper CAG deck (white)"
desc = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the white deck."
icon_state = "cag_white"
var/blanks = 5
/obj/item/weapon/deck/cah/black
name = "\improper CAG deck (black)"
desc = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the black deck."
icon_state = "cag_black"
blanks = 0
/obj/item/weapon/deck/cah/New()
..()
var/datum/playingcard/P
for(var/cardtext in card_text_list)
P = new()
P.name = "[cardtext]"
P.card_icon = "[icon_state]_card"
P.back_icon = "[icon_state]_card_back"
cards += P
if(!blanks)
return
for(var/x=1 to blanks)
P = new()
P.name = "Blank Card"
P.card_icon = "[icon_state]_card_back"
P.back_icon = "[icon_state]_card_back"

View File

@@ -0,0 +1,37 @@
// Black cards.
/obj/item/weapon/deck/cah/black/card_text_list = list(
"Why am I itchy?",
"Today, Security shot ____.",
"The Chaplain this shift is worshiping _____.",
"Cargo ordered a crate full of _____.",
"An ERT was called due to ______.",
"Alert! The Captain has armed themselves with _____.",
"Current Laws: ________ is your master.",
"Current Laws: ________ is the enemy.",
"_____ vented the entirety of Cargo.",
"Today, science found an anomaly that made people ____ and ____.",
"There was a rap battle between ____ and ____.",
"Caution, ______ have been detected in collision course with the station.",
"Today's kitchen menu includes _______.",
"What did the mercenaries want when they attacked the station?",
"I think the Captain is insane. He just demanded ______ in his office.",
"Fuckin' scientists, they just turned Misc. Research into _______ .",
"What's my fetish?",
"Hello, _______ here with _______",
"No one else was at _______, they wouldn't understand the ______",
"Why am I shivering?",
"What is this world coming to? First, ________, now _______",
"NanoTrasen's labor union decided to use _______ to raise employee morale.",
"The Chemist's drug of choice is ______",
"It is common practice for _______ to ______ on Moghes.",
"Mercurial Colonies are _____.",
"The Skrell are celebrating _____ today.",
"_____ is/are why I'm afraid of the maintenance tunnels.",
"_____ used ____ to create their newest invention, _____!",
"Scientists are not allowed to make Gatling _____.",
"It's not a party until the ____ arrive.",
"No matter how many Tajara you have, _____ is never acceptable.",
"No, the AI's first law is NOT to serve _____.",
"The robots are not disposal bins for your _____.",
"You can never have too many _____ on shift.",
)

View File

@@ -0,0 +1,75 @@
// White cards.
/obj/item/weapon/deck/cah/var/list/card_text_list = list(
"Those motherfucking carp",
"Having sex in the maintenance tunnels",
"Space 'Nam",
"Space lesbians",
"The Gardener getting SUPER high",
"The Captain thinking they're a badass",
"Being in a cult",
"Racially biased lawsets",
"An Unathi who WON'T STOP FIGHTING",
"Tajara fetishists",
"Bald thirty-year-olds",
"A Chief Engineer who can't setup the engine",
"Being sucked out into space",
"Officer Beepsky",
"Engineering",
"The grey tide.",
"The Research Director",
"Fucking synths",
"Man-eating purple pod plants",
"Chemical sprayers filled with lube",
"Librarians",
"Squids",
"Cats",
"Lizards",
"Apes",
"Trees",
"Supermatter undergarments",
"Bluespace",
"Five hundred rabid spiders",
"Five hundred rabid diona nymphs",
"Cable ties",
"Rampant vending machines",
"Positronic drink coasters",
"Kitchen utensil anomalies",
"Locked lockers",
"Energy spatulas",
"Flashbang gauntlets",
"Carp",
"Space whales",
"Blu-sharks",
"Fax machines",
"Exquisite Pens",
"Dr. Maxman's male enhancements",
"Gyrating slimes",
"Forehead-mounted laser weaponry",
"Pelvis-mounted laser weaponry",
"Cardboard cutouts",
"An obscene amount of rubber ducks",
"Brain cakes",
"A drone's game of life.",
"Anomaly suits",
"A gardener smoking reishi",
"Military-grade baseball bats",
"Barricading the bar",
"An irritatingly chipper robot",
"Androids hanging out in the bar drinking beer",
"Gear harnesses",
"A seventeen-year-old Captain",
"The throbbing erection that the HoS gets at the thought of shooting something",
"Trying to stab someone and hugging them instead",
"Waking up naked in the maintenance tunnels",
"Horrible cloning accidents",
"Licking the supermatter due to a dare",
"A Quartermaster who WON'T STOP ordering guns",
"Teaching a synthetic the Birds and the Bees",
"Unnecessary surgery",
"My addiction to spiders",
"wetskrell.nt",
"DOCTOR MAXMAN!",
"A group of Skrell getting their squish on",
"Enough soporific to put the entire station down",
"Delicious Vietnamese cuisine"
)

View File

@@ -4,6 +4,7 @@
icon_state = "card_pack_cardemon"
/obj/item/weapon/pack/cardemon/New()
..()
var/datum/playingcard/P
var/i
for(i=0; i<5; i++)

View File

@@ -20,7 +20,6 @@
/obj/item/weapon/deck/cards/New()
..()
var/datum/playingcard/P
for(var/suit in list("spades","clubs","diamonds","hearts"))
@@ -44,7 +43,6 @@
P.back_icon = "card_back"
cards += P
for(var/i = 0,i<2,i++)
P = new()
P.name = "joker"
@@ -135,7 +133,19 @@
H.throw_at(get_step(target,target.dir),10,1,H)
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/hand))
if(cards.len == 1 && istype(O, /obj/item/weapon/pen))
var/datum/playingcard/P = cards[1]
if(P.name != "Blank Card")
user << "You cannot write on that card."
return
var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Editing") as text|null, MAX_BOOK_MESSAGE_LEN)
if(!cardtext)
return
P.name = cardtext
// SNOWFLAKE FOR CAG, REMOVE IF OTHER CARDS ARE ADDED THAT USE THIS.
P.card_icon = "cag_white_card"
update_icon()
else if(istype(O,/obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
for(var/datum/playingcard/P in cards)
H.cards += P
@@ -214,7 +224,7 @@
if(!discarding || !to_discard[discarding] || !usr || !src) return
var/datum/playingcard/card = to_discard[discarding]
qdel(to_discard)
to_discard.Cut()
var/obj/item/weapon/hand/H = new(src.loc)
H.cards += card
@@ -238,7 +248,7 @@
if((!concealed || src.loc == user) && cards.len)
user << "It contains: "
for(var/datum/playingcard/P in cards)
user << "The [P.name]."
user << "\The [P.name]."
/obj/item/weapon/hand/update_icon(var/direction = 0)

View File

@@ -4,6 +4,7 @@
icon_state = "card_pack_spaceball"
/obj/item/weapon/pack/spaceball/New()
..()
var/datum/playingcard/P
var/i
var/year = 554 + text2num(time2text(world.timeofday, "YYYY"))
@@ -20,4 +21,4 @@
P.card_icon = "spaceball_standard"
P.back_icon = "card_back_spaceball"
cards += P
cards += P

View File

@@ -17,8 +17,6 @@
P.back_icon = "card_back_tarot"
cards += P
for(var/suit in list("wands","pentacles","cups","swords"))
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
P = new()
P.name = "[number] of [suit]"

View File

@@ -89,7 +89,7 @@
bee_count = 20
B.empty()
else
user.visible_message("<span class='notice'>[user] puts bees and larvae from \the [src] into \the [I].</span>", "<span class='notice'>You put puts bees and larvae from \the [src] into \the [I].</span>")
user.visible_message("<span class='notice'>[user] puts bees and larvae from \the [src] into \the [I].</span>", "<span class='notice'>You put bees and larvae from \the [src] into \the [I].</span>")
bee_count /= 2
B.fill()
update_icon()

View File

@@ -39,6 +39,7 @@
return
name = "[seed.seed_name]"
trash = seed.get_trash_type()
update_icon()

View File

@@ -69,6 +69,9 @@
/datum/seed/proc/get_trait(var/trait)
return traits["[trait]"]
/datum/seed/proc/get_trash_type()
return trash_type
/datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade)
if(!isnull(degrade)) nval *= degrade
if(!isnull(ubound)) nval = min(nval,ubound)
@@ -153,7 +156,6 @@
if(!body_coverage)
return
target << "<span class='danger'>You are stung by \the [fruit]!</span>"
for(var/rid in chems)
var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5))
@@ -178,9 +180,20 @@
for(var/mob/living/M in T.contents)
if(!M.reagents)
continue
for(var/chem in chems)
var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3))
M.reagents.add_reagent(chem,injecting)
var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
for(var/obj/item/clothing/clothes in M)
if(M.l_hand == clothes || M.r_hand == clothes)
continue
body_coverage &= ~(clothes.body_parts_covered)
if(!body_coverage)
continue
var/datum/reagents/R = M.reagents
var/mob/living/carbon/human/H = M
if(istype(H))
R = H.touching
if(istype(R))
for(var/chem in chems)
R.add_reagent(chem,min(5,max(1,get_trait(TRAIT_POTENCY)/3)))
//Applies an effect to a target atom.
/datum/seed/proc/thrown_at(var/obj/item/thrown,var/atom/target, var/force_explode)

View File

@@ -124,7 +124,7 @@
)
/obj/machinery/portable_atmospherics/hydroponics/AltClick()
if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
if(mechanical && !usr.incapacitated() && Adjacent(usr))
close_lid(usr)
return 1
return ..()
@@ -217,7 +217,7 @@
if(reagents.total_volume <= 0)
return
reagents.trans_to(temp_chem_holder, min(reagents.total_volume,rand(1,3)))
reagents.trans_to_obj(temp_chem_holder, min(reagents.total_volume,rand(1,3)))
for(var/datum/reagent/R in temp_chem_holder.reagents.reagent_list)
@@ -357,12 +357,15 @@
set category = "Object"
set src in view(1)
if(labelled)
usr << "You remove the label."
labelled = null
update_icon()
else
usr << "There is no label to remove."
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
if(labelled)
usr << "You remove the label."
labelled = null
update_icon()
else
usr << "There is no label to remove."
return
/obj/machinery/portable_atmospherics/hydroponics/verb/setlight()
@@ -370,10 +373,14 @@
set category = "Object"
set src in view(1)
var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
if(new_light)
tray_light = new_light
usr << "You set the tray to a light level of [tray_light] lumens."
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
if(new_light)
tray_light = new_light
usr << "You set the tray to a light level of [tray_light] lumens."
return
/obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity()
//Make sure various values are sane.
@@ -560,11 +567,10 @@
..()
if(!seed)
if(seed)
usr << "<span class='notice'>[seed.display_name] are growing here.</span>"
else
usr << "[src] is empty."
return
usr << "<span class='notice'>[seed.display_name] are growing here.</span>"
if(!Adjacent(usr))
return
@@ -572,29 +578,30 @@
usr << "Water: [round(waterlevel,0.1)]/100"
usr << "Nutrient: [round(nutrilevel,0.1)]/10"
if(weedlevel >= 5)
usr << "\The [src] is <span class='danger'>infested with weeds</span>!"
if(pestlevel >= 5)
usr << "\The [src] is <span class='danger'>infested with tiny worms</span>!"
if(dead)
usr << "<span class='danger'>The plant is dead.</span>"
else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2))
usr << "The plant looks <span class='danger'>unhealthy</span>."
if(seed)
if(weedlevel >= 5)
usr << "\The [src] is <span class='danger'>infested with weeds</span>!"
if(pestlevel >= 5)
usr << "\The [src] is <span class='danger'>infested with tiny worms</span>!"
if(dead)
usr << "<span class='danger'>The plant is dead.</span>"
else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2))
usr << "The plant looks <span class='danger'>unhealthy</span>."
if(mechanical)
var/turf/T = loc
var/datum/gas_mixture/environment
if(closed_system && (connected_port || holding))
var/environment_type
if(closed_system && (connected_port || holding) && air_contents)
environment = air_contents
if(!environment)
environment_type = "connected"
else
if(istype(T))
environment = T.return_air()
if(!environment) //We're in a crate or nullspace, bail out.
return
if(!environment) //We're in a crate or nullspace, bail out.
return
environment_type = "surrounding"
var/light_string
if(closed_system && mechanical)
@@ -608,18 +615,20 @@
light_available = 5
light_string = "a light level of [light_available] lumens"
usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K."
usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K at [environment.return_pressure()] kPa in the [environment_type] environment"
/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb()
set name = "Toggle Tray Lid"
set category = "Object"
set src in view(1)
close_lid(usr)
/obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user)
if(!user || user.stat || user.restrained())
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
close_lid(usr)
return
/obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user)
closed_system = !closed_system
user << "You [closed_system ? "close" : "open"] the tray's lid."
update_icon()

View File

@@ -96,7 +96,7 @@
dat += "<br>This sample contains: "
for(var/datum/reagent/R in grown_reagents.reagent_list)
dat += "<br>- [R.id], [grown_reagents.get_reagent_amount(R.id)] unit(s)"
dat += "<br>- [R.name], [grown_reagents.get_reagent_amount(R.id)] unit(s)"
dat += "<h2>Other Data</h2>"
@@ -175,8 +175,12 @@
if(grown_seed.get_trait(TRAIT_PARASITE))
dat += "<br>It is capable of parisitizing and gaining sustenance from tray weeds."
/*
There's currently no code that actually changes the temperature of the local environment, so let's not show it until there is.
if(grown_seed.get_trait(TRAIT_ALTER_TEMP))
dat += "<br>It will periodically alter the local temperature by [grown_seed.get_trait(TRAIT_ALTER_TEMP)] degrees Kelvin."
*/
if(grown_seed.get_trait(TRAIT_BIOLUM))
dat += "<br>It is [grown_seed.get_trait(TRAIT_BIOLUM_COLOUR) ? "<font color='[grown_seed.get_trait(TRAIT_BIOLUM_COLOUR)]'>bio-luminescent</font>" : "bio-luminescent"]."
@@ -197,18 +201,24 @@
if(grown_seed.get_trait(TRAIT_TELEPORTING))
dat += "<br>The fruit is temporal/spatially unstable."
if(grown_seed.get_trait(TRAIT_EXUDE_GASSES))
dat += "<br>It will release gas into the environment."
if(grown_seed.get_trait(TRAIT_CONSUME_GASSES))
dat += "<br>It will remove gas from the environment."
if(grown_seed.exude_gasses && grown_seed.exude_gasses.len)
for(var/gas in grown_seed.exude_gasses)
var/amount = ""
if (grown_seed.exude_gasses[gas] > 7)
amount = "large amounts of "
else if (grown_seed.exude_gasses[gas] < 5)
amount = "small amounts of "
dat += "<br>It will release [amount][gas_data.name[gas]] into the environment."
if(grown_seed.get_trait(TRAIT_EXUDE_GASSES))
dat += "<br>It will release gas into the environment."
if(grown_seed.get_trait(TRAIT_CONSUME_GASSES))
dat += "<br>It will remove gas from the environment."
if(grown_seed.consume_gasses && grown_seed.consume_gasses.len)
for(var/gas in grown_seed.consume_gasses)
var/amount = ""
if (grown_seed.consume_gasses[gas] > 7)
amount = "large amounts of "
else if (grown_seed.consume_gasses[gas] < 5)
amount = "small amounts of "
dat += "<br>It will consume [amount][gas_data.name[gas]] from the environment."
if(dat)
last_data = dat

View File

@@ -11,7 +11,7 @@
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
if(integrity>=100)
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")

View File

@@ -571,7 +571,7 @@ var/list/name_to_material
name = "wood"
stack_type = /obj/item/stack/material/wood
icon_colour = "#824B28"
integrity = 25
integrity = 50
icon_base = "solid"
explosion_resistance = 2
shard_type = SHARD_SPLINTER

View File

@@ -151,6 +151,8 @@ Works together with spawning an observer, noted above.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
ghost.key = key
if(ghost.client)
ghost.client.time_died_as_mouse = ghost.timeofdeath
if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
return ghost

View File

@@ -16,7 +16,7 @@
animation.master = src
flick(anim, animation)
if(do_gibs) gibs(loc, viruses, dna)
if(do_gibs) gibs(loc, dna)
spawn(15)
if(animation) qdel(animation)

View File

@@ -2,9 +2,8 @@
//m_type == 1 --> visual.
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null)
if(stat || !use_me && usr == src)
usr << "You are unable to emote."
src << "You are unable to emote."
return
var/muzzled = is_muzzled()

View File

@@ -65,14 +65,9 @@
if(istype(usr, /mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = usr
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
AI.eyeobj.setLoc(src)
// Return to the Core.
/mob/living/silicon/ai/proc/core()
set category = "AI Commands"
set name = "AI Core"
view_core()
var/turf/T = get_turf(src)
if(T)
AI.eyeobj.setLoc(T)
/mob/living/silicon/ai/proc/view_core()
camera = null
@@ -88,7 +83,7 @@
src.eyeobj.setLoc(src)
/mob/living/silicon/ai/proc/toggle_acceleration()
set category = "AI Commands"
set category = "AI Settings"
set name = "Toggle Camera Acceleration"
if(!eyeobj)

View File

@@ -10,7 +10,7 @@ var/list/holder_mob_icon_cache = list()
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Seromi" = 'icons/mob/species/seromi/head.dmi'
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
origin_tech = null
@@ -98,8 +98,9 @@ var/list/holder_mob_icon_cache = list()
/mob/living/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H))
get_scooped(H, (usr == src))
if(holder_type && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP))
if(!issmall(H) || !istype(src, /mob/living/carbon/human))
get_scooped(H, (usr == src))
return
return ..()

View File

@@ -103,64 +103,34 @@ var/list/slot_equipment_priority = list( \
//Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_l_hand(var/obj/item/W)
if(lying) return 0
if(!istype(W)) return 0
if(!l_hand)
W.forceMove(src) //TODO: move to equipped?
l_hand = W
W.layer = 20 //TODO: move to equipped?
// l_hand.screen_loc = ui_lhand
W.equipped(src,slot_l_hand)
if(client) client.screen |= W
if(pulling == W) stop_pulling()
update_inv_l_hand()
return 1
return 0
if(lying || !istype(W))
return 0
return 1
//Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_r_hand(var/obj/item/W)
if(lying) return 0
if(!istype(W)) return 0
if(!r_hand)
W.forceMove(src)
r_hand = W
W.layer = 20
// r_hand.screen_loc = ui_rhand
W.equipped(src,slot_r_hand)
if(client) client.screen |= W
if(pulling == W) stop_pulling()
update_inv_r_hand()
return 1
return 0
if(lying || !istype(W))
return 0
return 1
//Puts the item into our active hand if possible. returns 1 on success.
/mob/proc/put_in_active_hand(var/obj/item/W)
if(hand) return put_in_l_hand(W)
else return put_in_r_hand(W)
return 0 // Moved to human procs because only they need to use hands.
//Puts the item into our inactive hand if possible. returns 1 on success.
/mob/proc/put_in_inactive_hand(var/obj/item/W)
if(hand) return put_in_r_hand(W)
else return put_in_l_hand(W)
return 0 // As above.
//Puts the item our active hand if possible. Failing that it tries our inactive hand. Returns 1 on success.
//If both fail it drops it on the floor and returns 0.
//This is probably the main one you need to know :)
/mob/proc/put_in_hands(var/obj/item/W)
if(!W) return 0
if(put_in_active_hand(W))
update_inv_l_hand()
update_inv_r_hand()
return 1
else if(put_in_inactive_hand(W))
update_inv_l_hand()
update_inv_r_hand()
return 1
else
W.forceMove(get_turf(src))
W.layer = initial(W.layer)
W.dropped()
if(!W)
return 0
W.forceMove(get_turf(src))
W.layer = initial(W.layer)
W.dropped()
return 0
// Removes an item from inventory and places it in the target atom.
// If canremove or other conditions need to be checked then use unEquip instead.

View File

@@ -117,7 +117,7 @@
/datum/language/seromi
name = "Schechi"
desc = "A trilling language spoken by the diminutive Seromi."
desc = "A trilling language spoken by the diminutive Teshari."
speech_verb = "chirps"
ask_verb = "chirrups"
exclaim_verb = "trills"

View File

@@ -26,6 +26,8 @@
var/blood = 1
var/list/target_types = list()
var/maximum_search_range = 7
/mob/living/bot/cleanbot/New()
..()
get_targets()
@@ -36,6 +38,25 @@
if(radio_controller)
radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS)
/mob/living/bot/cleanbot/proc/handle_target()
if(loc == target.loc)
if(!cleaning)
UnarmedAttack(target)
return 1
if(!path.len)
// spawn(0)
path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard)
if(!path)
custom_emote(2, "[src] can't reach the target and is giving up.")
target = null
path = list()
return
if(path.len)
step_to(src, path[1])
path -= path[1]
return 1
return
/mob/living/bot/cleanbot/Life()
..()
@@ -46,7 +67,7 @@
return
if(cleaning)
return
if(!screwloose && !oddbutton && prob(5))
custom_emote(2, "makes an excited beeping booping sound!")
@@ -62,65 +83,64 @@
spawn(600)
ignorelist -= gib
if(!target) // Find a target
for(var/obj/effect/decal/cleanable/D in view(7, src))
if(D in ignorelist)
continue
for(var/T in target_types)
if(istype(D, T))
target = D
patrol_path = list()
// Find a target
if(pulledby) // Don't wiggle if someone pulls you
patrol_path = list()
return
if(!target) // No targets in range
if(!should_patrol)
return
var/found_spot
search_loop:
for(var/i=0, i <= maximum_search_range, i++)
for(var/obj/effect/decal/cleanable/D in view(i, src))
if(D in ignorelist)
continue
for(var/T in target_types)
if(istype(D, T))
patrol_path = list()
target = D
found_spot = handle_target()
if (found_spot)
break search_loop
else
target = null
continue // no need to check the other types
if(!patrol_path || !patrol_path.len)
if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet
var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq)
if(!frequency)
return
closest_dist = 9999
next_dest = null
next_dest_loc = null
var/datum/signal/signal = new()
signal.source = src
signal.transmission_method = 1
signal.data = list("findbeakon" = "patrol")
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
signal_sent = world.time
else
if(next_dest)
next_dest_loc = listener.memorized[next_dest]
if(next_dest_loc)
patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null)
signal_sent = 0
else
if(pulledby) // Don't wiggle if someone pulls you
patrol_path = list()
if(!found_spot && !target) // No targets in range
if(!patrol_path || !patrol_path.len)
if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet
var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq)
if(!frequency)
return
if(patrol_path[1] == loc)
patrol_path -= patrol_path[1]
var/moved = step_towards(src, patrol_path[1])
if(moved)
patrol_path -= patrol_path[1]
if(target)
if(loc == target.loc)
if(!cleaning)
UnarmedAttack(target)
closest_dist = 9999
next_dest = null
next_dest_loc = null
var/datum/signal/signal = new()
signal.source = src
signal.transmission_method = 1
signal.data = list("findbeakon" = "patrol")
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
signal_sent = world.time
else
if(next_dest)
next_dest_loc = listener.memorized[next_dest]
if(next_dest_loc)
patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null)
signal_sent = 0
else
if(pulledby) // Don't wiggle if someone pulls you
patrol_path = list()
return
if(!path.len)
spawn(0)
path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard)
if(!path)
path = list()
return
if(path.len)
step_to(src, path[1])
path -= path[1]
return
if(patrol_path[1] == loc)
patrol_path -= patrol_path[1]
var/moved = step_towards(src, patrol_path[1])
if(moved)
patrol_path -= patrol_path[1]
/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity)
if(!..())
@@ -133,7 +153,7 @@
return
cleaning = 1
custom_emote(2, "begins to clean up the [D]")
custom_emote(2, "begins to clean up \the [D]")
update_icons()
var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50
if(do_after(src, cleantime))
@@ -143,6 +163,8 @@
if(!D)
return
qdel(D)
if(D == target)
target = null
cleaning = 0
update_icons()

View File

@@ -41,7 +41,7 @@
if(prob(50))
new /obj/item/clothing/head/helmet(Tsec)
else
new /obj/item/clothing/suit/armor/vest(Tsec)
new /obj/item/clothing/suit/storage/vest(Tsec)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)

View File

@@ -287,10 +287,6 @@
if((H.getToxLoss() >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox)))
return treatment_tox
for(var/datum/disease/D in H.viruses)
if (!H.reagents.has_reagent(treatment_virus))
return treatment_virus // STOP DISEASE FOREVER
/* Construction */
/obj/item/weapon/storage/firstaid/attackby(var/obj/item/robot_parts/S, mob/user as mob)

View File

@@ -4,7 +4,6 @@
ingested = new/datum/reagents/metabolism(1000, src, CHEM_INGEST)
touching = new/datum/reagents/metabolism(1000, src, CHEM_TOUCH)
reagents = bloodstr
..()
/mob/living/carbon/Life()
@@ -36,9 +35,9 @@
. = ..()
if(.)
if(src.nutrition && src.stat != 2)
src.nutrition -= HUNGER_FACTOR/10
src.nutrition -= DEFAULT_HUNGER_FACTOR/10
if(src.m_intent == "run")
src.nutrition -= HUNGER_FACTOR/10
src.nutrition -= DEFAULT_HUNGER_FACTOR/10
if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
src.bodytemperature += 2
@@ -93,18 +92,6 @@
H << "\red You can't use your [temp.name]"
return
for(var/datum/disease/D in viruses)
if(D.spread_by_touch())
M.contract_disease(D, 0, 1, CONTACT_HANDS)
for(var/datum/disease/D in M.viruses)
if(D.spread_by_touch())
contract_disease(D, 0, 1, CONTACT_HANDS)
return
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null)
@@ -197,7 +184,7 @@
if(40 to INFINITY)
status += "peeling away"
if(org.status & ORGAN_DESTROYED)
if(org.is_stump())
status += "MISSING"
if(org.status & ORGAN_MUTATED)
status += "weirdly shapen"

View File

@@ -1,53 +1,42 @@
mob/living/carbon/verb/give(var/mob/living/carbon/target in view(1)-usr)
/mob/living/carbon/human/verb/give(var/mob/living/target in view(1)-usr)
set category = "IC"
set name = "Give"
if(!istype(target) || target.stat == 2 || usr.stat == 2|| target.client == null)
// TODO : Change to incapacitated() on merge.
if(usr.stat || usr.lying || usr.resting || usr.buckled)
return
var/obj/item/I
if(!usr.hand && usr.r_hand == null)
usr << "<span class='warning'>You don't have anything in your right hand to give to [target.name]</span>"
if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null)
return
if(usr.hand && usr.l_hand == null)
usr << "<span class='warning'>You don't have anything in your left hand to give to [target.name]</span>"
return
if(usr.hand)
I = usr.l_hand
else if(!usr.hand)
I = usr.r_hand
var/obj/item/I = usr.get_active_hand()
if(!I)
I = usr.get_inactive_hand()
if(!I)
usr << "<span class='warning'>You don't have anything in your hands to give to \the [target].</span>"
return
if(target.r_hand == null || target.l_hand == null)
switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No"))
if("Yes")
if(!I)
return
if(!Adjacent(usr))
usr << "<span class='warning'>You need to stay in reaching distance while giving an object.</span>"
target << "<span class='warning'>[usr.name] moved too far away.</span>"
return
if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I))
usr << "<span class='warning'>You need to keep the item in your active hand.</span>"
target << "<span class='warning'>[usr.name] seem to have given up on giving \the [I.name] to you.</span>"
return
if(target.r_hand != null && target.l_hand != null)
target << "<span class='warning'>Your hands are full.</span>"
usr << "<span class='warning'>Their hands are full.</span>"
return
else
usr.drop_item()
if(target.r_hand == null)
target.r_hand = I
else
target.l_hand = I
I.loc = target
I.layer = 20
I.add_fingerprint(target)
target.update_inv_l_hand()
target.update_inv_r_hand()
usr.update_inv_l_hand()
usr.update_inv_r_hand()
target.visible_message("<span class='notice'>[usr.name] handed \the [I.name] to [target.name].</span>")
if("No")
target.visible_message("<span class='warning'>[usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.</span>")
else
usr << "<span class='warning'>[target.name]'s hands are full.</span>"
if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No")
target.visible_message("<span class='notice'>\The [usr] tried to hand \the [I] to \the [target], \
but \the [target] didn't want it.</span>")
return
if(!I) return
if(!Adjacent(target))
usr << "<span class='warning'>You need to stay in reaching distance while giving an object.</span>"
target << "<span class='warning'>\The [usr] moved too far away.</span>"
return
if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I))
usr << "<span class='warning'>You need to keep the item in your hands.</span>"
target << "<span class='warning'>\The [usr] seems to have given up on passing \the [I] to you.</span>"
return
if(target.r_hand != null && target.l_hand != null)
target << "<span class='warning'>Your hands are full.</span>"
usr << "<span class='warning'>Their hands are full.</span>"
return
if(usr.unEquip(I))
target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea.
target.visible_message("<span class='notice'>\The [usr] handed \the [I] to \the [target].</span>")

View File

@@ -15,7 +15,7 @@
I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class))
..(species.gibbed_anim)
gibs(loc, viruses, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src))
gibs(loc, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src))
/mob/living/carbon/human/dust()
if(species)

View File

@@ -243,9 +243,6 @@
msg += "</span>"
if(getBrainLoss() >= 60)
msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n"
var/ssd_msg = species.get_ssd(src)
if(ssd_msg && (!should_have_organ("brain") || has_brain()) && stat != DEAD)
if(!key)
@@ -254,14 +251,12 @@
msg += "<span class='deadsay'>[T.He] [T.is] [ssd_msg].</span>\n"
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
var/list/is_bleeding = list()
for(var/organ_tag in species.has_limbs)
var/list/organ_data = species.has_limbs[organ_tag]
var/organ_descriptor = organ_data["descriptor"]
is_destroyed["organ_descriptor"] = 1
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
@@ -269,13 +264,11 @@
else if(E.is_stump())
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.</b></span>\n"
else
is_destroyed["organ_descriptor"] = 0
continue
for(var/obj/item/organ/external/temp in organs)
if(temp)
if(temp.status & ORGAN_DESTROYED)
is_destroyed["[temp.name]"] = 1
wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [temp.name].</b></span>\n"
continue
if(!is_synth && temp.status & ORGAN_ROBOT)

View File

@@ -116,7 +116,7 @@
b_loss = b_loss/1.5
f_loss = f_loss/1.5
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
if (!get_ear_protection() >= 2)
ear_damage += 30
ear_deaf += 120
if (prob(70) && !shielded)
@@ -126,7 +126,7 @@
b_loss += 30
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/2
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
if (!get_ear_protection() >= 2)
ear_damage += 15
ear_deaf += 60
if (prob(50) && !shielded)
@@ -305,7 +305,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ(BP_HEAD)
if(!head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
if(!head || head.disfigured || head.is_stump() || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -895,7 +895,7 @@
/mob/living/carbon/human/revive()
if(should_have_organ(O_HEART))
vessel.add_reagent("blood",560-vessel.total_volume)
vessel.add_reagent("blood",species.blood_volume-vessel.total_volume)
fixblood()
species.create_organs(src) // Reset our organs/limbs.
@@ -909,9 +909,6 @@
H.brainmob.mind.transfer_to(src)
qdel(H)
for (var/datum/disease/virus in viruses)
virus.cure()
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
@@ -1116,7 +1113,10 @@
spawn(0)
regenerate_icons()
vessel.add_reagent("blood",560-vessel.total_volume)
if(vessel.total_volume < species.blood_volume)
vessel.add_reagent("blood", species.blood_volume - vessel.total_volume)
else if(vessel.total_volume > species.blood_volume)
vessel.remove_reagent("blood", vessel.total_volume - species.blood_volume)
fixblood()
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
@@ -1360,6 +1360,48 @@
return 1
return 0
//Puts the item into our active hand if possible. returns 1 on success.
/mob/living/carbon/human/put_in_active_hand(var/obj/item/W)
return (hand ? put_in_l_hand(W) : put_in_r_hand(W))
//Puts the item into our inactive hand if possible. returns 1 on success.
/mob/living/carbon/human/put_in_inactive_hand(var/obj/item/W)
return (hand ? put_in_r_hand(W) : put_in_l_hand(W))
/mob/living/carbon/human/put_in_hands(var/obj/item/W)
if(!W)
return 0
if(put_in_active_hand(W))
update_inv_l_hand()
update_inv_r_hand()
return 1
else if(put_in_inactive_hand(W))
update_inv_l_hand()
update_inv_r_hand()
return 1
else
return ..()
/mob/living/carbon/human/put_in_l_hand(var/obj/item/W)
if(!..() || l_hand)
return 0
W.forceMove(src)
l_hand = W
W.equipped(src,slot_l_hand)
W.add_fingerprint(src)
update_inv_l_hand()
return 1
/mob/living/carbon/human/put_in_r_hand(var/obj/item/W)
if(!..() || r_hand)
return 0
W.forceMove(src)
r_hand = W
W.equipped(src,slot_r_hand)
W.add_fingerprint(src)
update_inv_r_hand()
return 1
/mob/living/carbon/human/can_stand_overridden()
if(wearing_rig && wearing_rig.ai_can_move_suit(check_for_ai = 1))
// Actually missing a leg will screw you up. Everything else can be compensated for.

View File

@@ -18,7 +18,7 @@
if(!temp || !temp.is_usable())
H << "\red You can't use your hand."
return
break_cloak()
..()
// Should this all be in Touch()?
@@ -138,7 +138,7 @@
var/hit_zone = H.zone_sel.selecting
var/obj/item/organ/external/affecting = get_organ(hit_zone)
if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
if(!affecting || affecting.is_stump())
M << "<span class='danger'>They are missing that limb!</span>"
return 1

View File

@@ -318,10 +318,10 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
This function restores the subjects blood to max.
*/
/mob/living/carbon/human/proc/restore_blood()
if(should_have_organ(O_HEART))
var/blood_volume = vessel.get_reagent_amount("blood")
vessel.add_reagent("blood",560.0-blood_volume)
if(!should_have_organ(O_HEART))
return
if(vessel.total_volume < species.blood_volume)
vessel.add_reagent("blood", species.blood_volume - vessel.total_volume)
/*
This function restores all organs.

View File

@@ -139,13 +139,6 @@ emp_act
if(.) return
return 0
/mob/living/carbon/human/emp_act(severity)
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
..()
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
@@ -160,7 +153,7 @@ emp_act
var/obj/item/organ/external/affecting = get_organ(target_zone)
if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
if (!affecting || affecting.is_stump())
user << "<span class='danger'>They are missing that limb!</span>"
return 0

Some files were not shown because too many files have changed in this diff Show More