Merge branch 'master' of https://github.com/PolarisSS13/Polaris into NanoGrade

Conflicts:
	code/modules/client/client procs.dm
	nano/templates/robot_control.tmpl
This commit is contained in:
SinTwo
2016-07-27 16:11:55 -04:00
601 changed files with 16156 additions and 7173 deletions

View File

@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="510"
BYOND_MINOR="1346"
MACRO_COUNT=987
MACRO_COUNT=986
cache:
directories:

View File

@@ -37,5 +37,5 @@
// Chemistry lists.
var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") // Increase heart rate.
var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") // Decrease heart rate.
var/list/heartstopper = list("potassium_phorochloride", "zombie_powder") // This stops the heart.
var/list/heartstopper = list("potassium_chlorophoride", "zombie_powder") // This stops the heart.
var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional

View File

@@ -68,10 +68,12 @@ var/list/be_special_flags = list(
#define MODE_COMMANDO "commando"
#define MODE_DEATHSQUAD "deathsquad"
#define MODE_ERT "ert"
#define MODE_TRADE "trader"
#define MODE_MERCENARY "mercenary"
#define MODE_NINJA "ninja"
#define MODE_RAIDER "raider"
#define MODE_WIZARD "wizard"
#define MODE_TECHNOMANCER "technomancer"
#define MODE_CHANGELING "changeling"
#define MODE_CULTIST "cultist"
#define MODE_HIGHLANDER "highlander"
@@ -83,7 +85,7 @@ var/list/be_special_flags = list(
#define MODE_TRAITOR "traitor"
#define MODE_AUTOTRAITOR "autotraitor"
#define DEFAULT_TELECRYSTAL_AMOUNT 12
#define DEFAULT_TELECRYSTAL_AMOUNT 120
/////////////////
////WIZARD //////

View File

@@ -92,7 +92,8 @@
// Setting this much higher than 1024 could allow spammers to DOS the server easily.
#define MAX_MESSAGE_LEN 1024
#define MAX_PAPER_MESSAGE_LEN 6144
#define MAX_BOOK_MESSAGE_LEN 12288
#define MAX_BOOK_MESSAGE_LEN 24576
#define MAX_RECORD_LENGTH 24576
#define MAX_LNAME_LEN 64
#define MAX_NAME_LEN 52
@@ -161,3 +162,8 @@
#define CAT_NORMAL 1
#define CAT_HIDDEN 2
#define CAT_COIN 4
//Antag Faction Visbility
#define ANTAG_HIDDEN "Hidden"
#define ANTAG_SHARED "Shared"
#define ANTAG_KNOWN "Known"

View File

@@ -156,7 +156,7 @@
// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects,
// being unable to hear people due to being in a box within a bag.
/proc/recursive_content_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_mobs = 1, var/include_objects = 1)
/proc/recursive_content_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_mobs = 1, var/include_objects = 1, var/ignore_show_messages = 0)
if(!recursion_limit)
return L
@@ -176,7 +176,7 @@
else if(istype(I,/obj/))
var/obj/check_obj = I
if(check_obj.show_messages)
if(ignore_show_messages || check_obj.show_messages)
if(!sight_check || isInSight(I, O))
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
if(include_objects)

View File

@@ -119,27 +119,12 @@ proc/age2agedescription(age)
if(70 to INFINITY) return "elderly"
else return "unknown"
proc/RoundHealth(health)
switch(health)
if(100 to INFINITY)
return "health100"
if(70 to 100)
return "health80"
if(50 to 70)
return "health60"
if(30 to 50)
return "health40"
if(18 to 30)
return "health25"
if(5 to 18)
return "health10"
if(1 to 5)
return "health1"
if(-99 to 0)
return "health0"
else
return "health-100"
return "0"
/proc/RoundHealth(health)
var/list/icon_states = icon_states('icons/mob/hud_med.dmi')
for(var/icon_state in icon_states)
if(health >= text2num(icon_state))
return icon_state
return icon_states[icon_states.len] // If we had no match, return the last element
/*
Proc for attack log creation, because really why not

View File

@@ -1037,12 +1037,6 @@ proc/get_mob_with_client_list()
else if (zone == "r_foot") return "right foot"
else return zone
//gets the turf the atom is located in (or itself, if it is a turf).
//returns null if the atom is not in a turf.
/proc/get_turf(atom/movable/A)
if(isturf(A)) return A
if(A && A.locs.len) return A.locs[1]
/proc/get(atom/loc, type)
while(loc)
if(istype(loc, type))

View File

@@ -1,6 +1,8 @@
#define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x))
#define CLAMP01(x) (Clamp(x, 0, 1))
#define get_turf(A) get_step(A,0)
#define isAI(A) istype(A, /mob/living/silicon/ai)
#define isalien(A) istype(A, /mob/living/carbon/alien)

View File

@@ -103,6 +103,9 @@
#define ui_alien_health "EAST-1:28,CENTER-1:13" //aliens have the health display where humans have the pressure damage indicator.
#define ui_ling_chemical_display "EAST-1:28,CENTER-3:15"
#define ui_wiz_energy_display "EAST-1:28,CENTER-3:15"
//#define ui_wiz_instability_display "EAST-2:28,CENTER-3:15"
#define ui_wiz_instability_display "EAST-1:28,NORTH-2:27"
//Pop-up inventory
#define ui_shoes "WEST+1:8,SOUTH:5"
@@ -137,5 +140,5 @@
#define ui_iarrowleft "SOUTH-1,EAST-4"
#define ui_iarrowright "SOUTH-1,EAST-2"
#define ui_spell_master "EAST-1:16,NORTH-1:16"
#define ui_spell_master "EAST-2:16,NORTH-1:26"
#define ui_genetic_master "EAST-1:16,NORTH-3:16"

View File

@@ -0,0 +1,378 @@
/obj/screen/movable/ability_master
name = "Abilities"
icon = 'icons/mob/screen_spells.dmi'
icon_state = "grey_spell_ready"
var/list/obj/screen/ability/ability_objects = list()
var/showing = 0 // If we're 'open' or not.
var/open_state = "master_open" // What the button looks like when it's 'open', showing the other buttons.
var/closed_state = "master_closed" // Button when it's 'closed', hiding everything else.
screen_loc = ui_spell_master // TODO: Rename
var/mob/my_mob = null // The mob that possesses this hud object.
/obj/screen/movable/ability_master/New(owner)
if(owner)
my_mob = owner
update_abilities(0, owner)
else
message_admins("ERROR: ability_master's New() was not given an owner argument. This is a bug.")
/obj/screen/movable/ability_master/Destroy()
..()
//Get rid of the ability objects.
remove_all_abilities()
ability_objects.Cut()
// After that, remove ourselves from the mob seeing us, so we can qdel cleanly.
if(my_mob)
my_mob.ability_master = null
if(my_mob.client && my_mob.client.screen)
my_mob.client.screen -= src
my_mob = null
/obj/screen/movable/ability_master/ResetVars()
..("ability_objects", args)
remove_all_abilities()
// ability_objects = list()
/obj/screen/movable/ability_master/MouseDrop()
if(showing)
return
return ..()
/obj/screen/movable/ability_master/Click()
if(!ability_objects.len) // If we're empty for some reason.
// qdel(src)
return
toggle_open()
/obj/screen/movable/ability_master/proc/toggle_open(var/forced_state = 0)
if(showing && (forced_state != 2)) // We are closing the ability master, hide the abilities.
for(var/obj/screen/ability/O in ability_objects)
if(my_mob && my_mob.client)
my_mob.client.screen -= O
// O.handle_icon_updates = 0
showing = 0
overlays.len = 0
overlays.Add(closed_state)
else if(forced_state != 1) // We're opening it, show the icons.
open_ability_master()
update_abilities(1)
showing = 1
overlays.len = 0
overlays.Add(open_state)
update_icon()
/obj/screen/movable/ability_master/proc/open_ability_master()
var/list/screen_loc_xy = splittext(screen_loc,",")
//Create list of X offsets
var/list/screen_loc_X = splittext(screen_loc_xy[1],":")
var/x_position = decode_screen_X(screen_loc_X[1])
var/x_pix = screen_loc_X[2]
//Create list of Y offsets
var/list/screen_loc_Y = splittext(screen_loc_xy[2],":")
var/y_position = decode_screen_Y(screen_loc_Y[1])
var/y_pix = screen_loc_Y[2]
for(var/i = 1; i <= ability_objects.len; i++)
var/obj/screen/ability/A = ability_objects[i]
var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7)
var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7))
A.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]"
if(my_mob && my_mob.client)
my_mob.client.screen += A
// A.handle_icon_updates = 1
/obj/screen/movable/ability_master/proc/update_abilities(forced = 0, mob/user)
update_icon()
if(user && user.client)
if(!(src in user.client.screen))
user.client.screen += src
var/i = 1
for(var/obj/screen/ability/ability in ability_objects)
ability.update_icon(forced)
ability.maptext = "[i]" // Slot number
i++
/obj/screen/movable/ability_master/update_icon()
if(ability_objects.len)
invisibility = 0
else
invisibility = 101
/obj/screen/movable/ability_master/proc/add_ability(var/name_given)
if(!name) return
// if(spell.connected_button) //we have one already, for some reason
// if(spell.connected_button in spell_objects)
// return
// else
// spell_objects.Add(spell.connected_button)
// if(spell_holder.client)
// toggle_open(2)
// return
// if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one
// return
var/obj/screen/ability/new_button = new /obj/screen/ability
new_button.ability_master = src
// new_button.spell = spell
// spell.connected_button = newscreen
// if(!spell.override_base) //if it's not set, we do basic checks
// if(spell.spell_flags & CONSTRUCT_CHECK)
// newscreen.spell_base = "const" //construct spells
// else
// newscreen.spell_base = "wiz" //wizard spells
// else
// newscreen.spell_base = spell.override_base
new_button.name = name_given
new_button.ability_icon_state = name_given
new_button.update_icon(1)
ability_objects.Add(new_button)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen
/obj/screen/movable/ability_master/proc/remove_ability(var/obj/screen/ability/ability)
if(!ability)
return
ability_objects.Remove(ability)
qdel(ability)
if(ability_objects.len)
toggle_open(showing + 1)
update_icon()
// else
// qdel(src)
/obj/screen/movable/ability_master/proc/remove_all_abilities()
for(var/obj/screen/ability/A in ability_objects)
remove_ability(A)
/obj/screen/movable/ability_master/proc/get_ability_by_name(name_to_search)
for(var/obj/screen/ability/A in ability_objects)
if(A.name == name_to_search)
return A
return null
/obj/screen/movable/ability_master/proc/get_ability_by_proc_ref(proc_ref)
for(var/obj/screen/ability/verb_based/V in ability_objects)
if(V.verb_to_call == proc_ref)
return V
return null
/obj/screen/movable/ability_master/proc/get_ability_by_instance(var/obj/instance/)
for(var/obj/screen/ability/obj_based/O in ability_objects)
if(O.object == instance)
return O
return null
/mob/Login()
..()
if(ability_master)
ability_master.toggle_open(1)
client.screen -= ability_master
/mob/New()
..()
ability_master = new /obj/screen/movable/ability_master(src)
///////////ACTUAL ABILITIES////////////
//This is what you click to do things//
///////////////////////////////////////
/obj/screen/ability
icon = 'icons/mob/screen_spells.dmi'
icon_state = "grey_spell_base"
maptext_x = 3
var/background_base_state = "grey"
var/ability_icon_state = null
// var/spell/spell = null
var/obj/screen/movable/ability_master/ability_master
// var/icon/last_charged_icon
/obj/screen/ability/Destroy()
if(ability_master)
ability_master.ability_objects -= src
if(ability_master.my_mob && ability_master.my_mob.client)
ability_master.my_mob.client.screen -= src
if(ability_master && !ability_master.ability_objects.len)
ability_master.update_icon()
// qdel(ability_master)
ability_master = null
..()
/obj/screen/ability/update_icon()
// if(!spell)
// qdel(src)
// return
// if((last_charge == spell.charge_counter || !handle_icon_updates) && !forced_update)
// return //nothing to see here
// overlays -= spell.hud_state
// if(spell.charge_type == Sp_RECHARGE || spell.charge_type == Sp_CHARGES)
// if(spell.charge_counter < spell.charge_max)
// icon_state = "[background_base_state]_spell_base"
// if(spell.charge_counter > 0)
// var/icon/partial_charge = icon(src.icon, "[spell_base]_spell_ready")
// partial_charge.Crop(1, 1, partial_charge.Width(), round(partial_charge.Height() * spell.charge_counter / spell.charge_max))
// overlays += partial_charge
// if(last_charged_icon)
// overlays -= last_charged_icon
// last_charged_icon = partial_charge
// else if(last_charged_icon)
// overlays -= last_charged_icon
// last_charged_icon = null
// else
// icon_state = "[spell_base]_spell_ready"
// if(last_charged_icon)
// overlays -= last_charged_icon
// else
// icon_state = "[spell_base]_spell_ready"
overlays.Cut()
icon_state = "[background_base_state]_spell_base"
overlays += ability_icon_state
// last_charge = spell.charge_counter
// overlays -= "silence"
// if(spell.silenced)
// overlays += "silence"
/obj/screen/ability/Click()
if(!usr)
// qdel(src)
return
// spell.perform(usr)
activate()
// Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to.
/obj/screen/ability/proc/activate()
world << "[src] had activate() called."
return
// This checks if the ability can be used.
/obj/screen/ability/proc/can_activate()
return 1
/client/verb/activate_ability(var/slot as num)
set name = ".activate_ability"
// set hidden = 1
if(!mob)
return // Paranoid.
if(isnull(slot) || !isnum(slot))
src << "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>"
return // Bad input.
if(!mob.ability_master)
return // No abilities.
if(slot > mob.ability_master.ability_objects.len || slot <= 0)
return // Out of bounds.
var/obj/screen/ability/A = mob.ability_master.ability_objects[slot]
A.activate()
//////////Verb Abilities//////////
//Buttons to trigger verbs/procs//
//////////////////////////////////
/obj/screen/ability/verb_based
var/verb_to_call = null
var/object_used = null
var/arguments_to_use = list()
/obj/screen/ability/verb_based/activate()
if(object_used && verb_to_call)
call(object_used,verb_to_call)(arguments_to_use)
// call(object_used,verb_to_call)(arguments_to_use)
// world << "Attempted to call([object_used],[verb_to_call])([arguments_to_use])"
// if(hascall(object_used, verb_to_call))
// call(object_used,verb_to_call)(arguments_to_use)
// else
// message_admins("ERROR: activate() on [ability_master.my_mob]'s [src] failed the hascall([object_used],[verb_to_call]) check.")
/obj/screen/movable/ability_master/proc/add_verb_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
if(!object_given)
message_admins("ERROR: add_verb_ability() was not given an object in its arguments.")
if(!verb_given)
message_admins("ERROR: add_verb_ability() was not given a verb/proc in its arguments.")
if(get_ability_by_proc_ref(verb_given))
return // Duplicate
var/obj/screen/ability/verb_based/A = new /obj/screen/ability/verb_based()
A.ability_master = src
A.object_used = object_given
A.verb_to_call = verb_given
A.ability_icon_state = ability_icon_given
A.name = name_given
if(arguments)
A.arguments_to_use = arguments
ability_objects.Add(A)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen
//Changeling Abilities
/obj/screen/ability/verb_based/changeling
icon_state = "ling_spell_base"
background_base_state = "ling"
/obj/screen/movable/ability_master/proc/add_ling_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
if(!object_given)
message_admins("ERROR: add_ling_ability() was not given an object in its arguments.")
if(!verb_given)
message_admins("ERROR: add_ling_ability() was not given a verb/proc in its arguments.")
if(get_ability_by_proc_ref(verb_given))
return // Duplicate
var/obj/screen/ability/verb_based/changeling/A = new /obj/screen/ability/verb_based/changeling()
A.ability_master = src
A.object_used = object_given
A.verb_to_call = verb_given
A.ability_icon_state = ability_icon_given
A.name = name_given
if(arguments)
A.arguments_to_use = arguments
ability_objects.Add(A)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen
/////////Obj Abilities////////
//Buttons to trigger objects//
//////////////////////////////
/obj/screen/ability/obj_based
var/obj/object = null
/obj/screen/ability/obj_based/activate()
if(object)
object.Click()
// Technomancer
/obj/screen/ability/obj_based/technomancer
icon_state = "wiz_spell_base"
background_base_state = "wiz"
/obj/screen/movable/ability_master/proc/add_technomancer_ability(var/obj/object_given, var/ability_icon_given)
if(!object_given)
message_admins("ERROR: add_technomancer_ability() was not given an object in its arguments.")
if(get_ability_by_instance(object_given))
return // Duplicate
var/obj/screen/ability/obj_based/technomancer/A = new /obj/screen/ability/obj_based/technomancer()
A.ability_master = src
A.object = object_given
A.ability_icon_state = ability_icon_given
A.name = object_given.name
ability_objects.Add(A)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen

View File

@@ -133,6 +133,8 @@ var/list/global_huds = list(
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/obj/screen/lingchemdisplay
var/obj/screen/wiz_instability_display
var/obj/screen/wiz_energy_display
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/r_hand_hud_object
@@ -159,6 +161,8 @@ datum/hud/New(mob/owner)
disarm_intent = null
help_intent = null
lingchemdisplay = null
wiz_instability_display = null
wiz_energy_display = null
blobpwrdisplay = null
blobhealthdisplay = null
r_hand_hud_object = null

View File

@@ -303,6 +303,17 @@
mymob.ling_chem_display.icon_state = "ling_chems"
hud_elements |= mymob.ling_chem_display
mymob.wiz_instability_display = new /obj/screen/wizard/instability()
mymob.wiz_instability_display.screen_loc = ui_wiz_instability_display
mymob.wiz_instability_display.icon_state = "wiz_instability_none"
hud_elements |= mymob.wiz_instability_display
mymob.wiz_energy_display = new/obj/screen/wizard/energy()
mymob.wiz_energy_display.screen_loc = ui_wiz_energy_display
mymob.wiz_energy_display.icon_state = "wiz_energy"
hud_elements |= mymob.wiz_energy_display
mymob.pain = new /obj/screen( null )
mymob.zone_sel = new /obj/screen/zone_sel( null )
@@ -371,3 +382,15 @@
/obj/screen/ling/chems
name = "chemical storage"
icon_state = "power_display"
/obj/screen/wizard
invisibility = 101
/obj/screen/wizard/instability
name = "instability"
icon_state = "instability-1"
invisibility = 0
/obj/screen/wizard/energy
name = "energy"
icon_state = "wiz_energy"

View File

@@ -15,7 +15,7 @@ mob/attacked_with_item() should then do mob-type specific stuff (like determinin
Item Hit Effects:
item/apply_hit_effect() can be overriden to do whatever you want. However "standard" physical damage based weapons should make use of the target mob's hit_with_weapon() proc to
item/apply_hit_effect() can be overriden to do whatever you want. However "standard" physical damage based weapons should make use of the target mob's hit_with_weapon() proc to
avoid code duplication. This includes items that may sometimes act as a standard weapon in addition to having other effects (e.g. stunbatons on harm intent).
*/
@@ -76,9 +76,10 @@ avoid code duplication. This includes items that may sometimes act as a standard
//Called when a weapon is used to make a successful melee attack on a mob. Returns the blocked result
/obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
user.break_cloak()
if(hitsound)
playsound(loc, hitsound, 50, 1, -1)
var/power = force
if(HULK in user.mutations)
power *= 2

View File

@@ -65,6 +65,7 @@ var/list/gamemode_cache = list()
var/usewhitelist = 0
var/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0
var/show_mods = 0
var/show_devs = 0
var/show_mentors = 0
var/mods_can_tempban = 0
var/mods_can_job_tempban = 0
@@ -505,6 +506,9 @@ var/list/gamemode_cache = list()
if("show_mods")
config.show_mods = 1
if("show_devs")
config.show_devs = 1
if("show_mentors")
config.show_mentors = 1

View File

@@ -223,6 +223,17 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttles["Administration"] = shuttle
process_shuttles += shuttle
shuttle = new()
shuttle.location = 1
shuttle.warmup_time = 10 //want some warmup time so people can cancel.
shuttle.area_offsite = locate(/area/shuttle/trade/centcom)
shuttle.area_station = locate(/area/shuttle/trade/station)
shuttle.docking_controller_tag = "trade_shuttle"
shuttle.dock_target_station = "trade_shuttle_dock_airlock"
shuttle.dock_target_offsite = "trade_shuttle_bay"
shuttles["Trade"] = shuttle
process_shuttles += shuttle
shuttle = new()
shuttle.area_offsite = locate(/area/shuttle/alien/base)
shuttle.area_station = locate(/area/shuttle/alien/mine)

View File

@@ -102,6 +102,15 @@ var/global/list/all_exonet_connections = list()
return exonet.address
return null
// Proc: get_atom_from_address()
// Parameters: 1 (target_address - the desired address to find)
// Description: Searches an address for the atom it is attached for, otherwise returns null.
/datum/exonet_protocol/proc/get_atom_from_address(var/target_address)
for(var/datum/exonet_protocol/exonet in all_exonet_connections)
if(exonet.address == target_address)
return exonet.holder
return null
// Proc: send_message()
// Parameters: 3 (target_address - the desired address to send the message to, message - the message to send, text - the message text if message is of type "text")
// Description: Sends the message to target_address, by calling receive_message() on the desired datum.

View File

@@ -0,0 +1,389 @@
/datum/category_item/autolathe/arms/syringegun_ammo
name = "syringe gun cartridge"
path =/obj/item/weapon/syringe_cartridge
////////////////
/*Ammo casings*/
////////////////
/datum/category_item/autolathe/arms/shotgun_blanks
name = "ammunition (12g, blank)"
path =/obj/item/ammo_casing/shotgun/blank
/datum/category_item/autolathe/arms/shotgun_beanbag
name = "ammunition (12g, beanbag)"
path =/obj/item/ammo_casing/shotgun/beanbag
/datum/category_item/autolathe/arms/shotgun_flash
name = "ammunition (12g, flash)"
path =/obj/item/ammo_casing/shotgun/flash
/datum/category_item/autolathe/arms/shotgun
name = "ammunition (12g, slug)"
path =/obj/item/ammo_casing/shotgun
hidden = 1
/datum/category_item/autolathe/arms/shotgun_pellet
name = "ammunition (12g, pellet)"
path =/obj/item/ammo_casing/shotgun/pellet
hidden = 1
/datum/category_item/autolathe/arms/stunshell
name = "ammunition (stun cartridge, shotgun)"
path =/obj/item/ammo_casing/shotgun/stunshell
hidden = 1
//////////////////
/*Ammo magazines*/
//////////////////
/////// 5mm
/*
/datum/category_item/autolathe/arms/pistol_5mm
name = "pistol magazine (5mm)"
path =/obj/item/ammo_magazine/c5mm
category = "Arms and Ammunition"
hidden = 1
*/
/////// .45
/datum/category_item/autolathe/arms/pistol_45
name = "pistol magazine (.45)"
path =/obj/item/ammo_magazine/c45m
hidden = 1
/datum/category_item/autolathe/arms/pistol_45p
name = "pistol magazine (.45 practice)"
path =/obj/item/ammo_magazine/c45m/practice
/datum/category_item/autolathe/arms/pistol_45r
name = "pistol magazine (.45 rubber)"
path =/obj/item/ammo_magazine/c45m/rubber
/datum/category_item/autolathe/arms/pistol_45f
name = "pistol magazine (.45 flash)"
path =/obj/item/ammo_magazine/c45m/flash
/datum/category_item/autolathe/arms/pistol_45uzi
name = "uzi magazine (.45)"
path =/obj/item/ammo_magazine/c45uzi
hidden = 1
/datum/category_item/autolathe/arms/tommymag
name = "Tommygun magazine (.45)"
path =/obj/item/ammo_magazine/tommymag
hidden = 1
/datum/category_item/autolathe/arms/tommydrum
name = "Tommygun drum magazine (.45)"
path =/obj/item/ammo_magazine/tommydrum
hidden = 1
/////// 9mm
/obj/item/ammo_magazine/mc9mm/flash
ammo_type =/obj/item/ammo_casing/c9mmf
/obj/item/ammo_magazine/mc9mm/rubber
name = "magazine (9mm rubber)"
ammo_type =/obj/item/ammo_casing/c9mmr
/obj/item/ammo_magazine/mc9mm/practice
name = "magazine (9mm practice)"
ammo_type =/obj/item/ammo_casing/c9mmp
/datum/category_item/autolathe/arms/pistol_9mm
name = "pistol magazine (9mm)"
path =/obj/item/ammo_magazine/mc9mm
hidden = 1
/datum/category_item/autolathe/arms/pistol_9mmr
name = "pistol magazine (9mm rubber)"
path =/obj/item/ammo_magazine/mc9mm/rubber
/datum/category_item/autolathe/arms/pistol_9mmp
name = "pistol magazine (9mm practice)"
path =/obj/item/ammo_magazine/mc9mm/practice
/datum/category_item/autolathe/arms/pistol_9mmf
name = "pistol magazine (9mm flash)"
path =/obj/item/ammo_magazine/mc9mm/flash
/datum/category_item/autolathe/arms/smg_9mm
name = "top-mounted SMG magazine (9mm)"
path =/obj/item/ammo_magazine/mc9mmt
hidden = 1
/datum/category_item/autolathe/arms/smg_9mmr
name = "top-mounted SMG magazine (9mm rubber)"
path =/obj/item/ammo_magazine/mc9mmt/rubber
/datum/category_item/autolathe/arms/smg_9mmp
name = "top-mounted SMG magazine (9mm practice)"
path =/obj/item/ammo_magazine/mc9mmt/practice
/datum/category_item/autolathe/arms/smg_9mmf
name = "top-mounted SMG magazine (9mm flash)"
path =/obj/item/ammo_magazine/mc9mmt/flash
/////// 10mm
/datum/category_item/autolathe/arms/smg_10mm
name = "SMG magazine (10mm)"
path =/obj/item/ammo_magazine/a10mm
hidden = 1
/datum/category_item/autolathe/arms/pistol_50
name = "pistol magazine (.50AE)"
path =/obj/item/ammo_magazine/a50
hidden = 1
/////// 5.56mm
/datum/category_item/autolathe/arms/rifle_556
name = "10rnd rifle magazine (5.56mm)"
path =/obj/item/ammo_magazine/a556
hidden = 1
/datum/category_item/autolathe/arms/rifle_556p
name = "10rnd rifle magazine (5.56mm practice)"
path =/obj/item/ammo_magazine/a556/practice
/datum/category_item/autolathe/arms/rifle_556m
name = "20rnd rifle magazine (5.56mm)"
path =/obj/item/ammo_magazine/a556m
hidden = 1
/datum/category_item/autolathe/arms/rifle_556mp
name = "20rnd rifle magazine (5.56mm practice)"
path =/obj/item/ammo_magazine/a556m/practice
hidden = 1
/////// 7.62
/datum/category_item/autolathe/arms/rifle_small_762
name = "10rnd rifle magazine (7.62mm)"
path =/obj/item/ammo_magazine/s762
hidden = 1
/datum/category_item/autolathe/arms/rifle_762
name = "20rnd rifle magazine (7.62mm)"
path =/obj/item/ammo_magazine/c762
hidden = 1
/datum/category_item/autolathe/arms/machinegun_762
name = "machinegun box magazine (7.62)"
path =/obj/item/ammo_magazine/a762
hidden = 1
/datum/category_item/autolathe/arms/shotgun_magazine
name = "24rnd shotgun magazine (12g)"
path =/obj/item/ammo_magazine/g12
hidden = 1
/* Commented out until autolathe stuff is decided/fixed. Will probably remove these entirely. -Spades
// These should always be/empty! The idea is to fill them up manually with ammo clips.
/datum/category_item/autolathe/arms/pistol_5mm
name = "pistol magazine (5mm)"
path =/obj/item/ammo_magazine/c5mm/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/smg_5mm
name = "top-mounted SMG magazine (5mm)"
path =/obj/item/ammo_magazine/c5mmt/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_45
name = "pistol magazine (.45)"
path =/obj/item/ammo_magazine/c45m/empty
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_45uzi
name = "uzi magazine (.45)"
path =/obj/item/ammo_magazine/c45uzi/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/tommymag
name = "Tommygun magazine (.45)"
path =/obj/item/ammo_magazine/tommymag/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/tommydrum
name = "Tommygun drum magazine (.45)"
path =/obj/item/ammo_magazine/tommydrum/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_9mm
name = "pistol magazine (9mm)"
path =/obj/item/ammo_magazine/mc9mm/empty
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/smg_9mm
name = "top-mounted SMG magazine (9mm)"
path =/obj/item/ammo_magazine/mc9mmt/empty
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/smg_10mm
name = "SMG magazine (10mm)"
path =/obj/item/ammo_magazine/a10mm/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_50
name = "pistol magazine (.50AE)"
path =/obj/item/ammo_magazine/a50/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/rifle_556
name = "10rnd rifle magazine (5.56mm)"
path =/obj/item/ammo_magazine/a556/empty
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/rifle_556m
name = "20rnd rifle magazine (5.56mm)"
path =/obj/item/ammo_magazine/a556m/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/rifle_SVD
name = "10rnd rifle magazine (7.62mm)"
path =/obj/item/ammo_magazine/SVD/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/rifle_762
name = "20rnd rifle magazine (7.62mm)"
path =/obj/item/ammo_magazine/c762/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/machinegun_762
name = "machinegun box magazine (7.62)"
path =/obj/item/ammo_magazine/a762/empty
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/shotgun_magazine
name = "24rnd shotgun magazine (12g)"
path =/obj/item/ammo_magazine/g12/empty
category = "Arms and Ammunition"
hidden = 1*/
///////////////////////////////
/*Ammo clips and Speedloaders*/
///////////////////////////////
/datum/category_item/autolathe/arms/speedloader_357
name = "speedloader (.357)"
path =/obj/item/ammo_magazine/a357
hidden = 1
/datum/category_item/autolathe/arms/speedloader_38
name = "speedloader (.38)"
path =/obj/item/ammo_magazine/c38
hidden = 1
/datum/category_item/autolathe/arms/speedloader_38r
name = "speedloader (.38 rubber)"
path =/obj/item/ammo_magazine/c38/rubber
// Commented out until metal exploits with autolathe is fixed.
/*/datum/category_item/autolathe/arms/pistol_clip_45
name = "ammo clip (.45)"
path =/obj/item/ammo_magazine/clip/c45
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_clip_45r
name = "ammo clip (.45 rubber)"
path =/obj/item/ammo_magazine/clip/c45/rubber
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_45f
name = "ammo clip (.45 flash)"
path =/obj/item/ammo_magazine/clip/c45/flash
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_45p
name = "ammo clip (.45 practice)"
path =/obj/item/ammo_magazine/clip/c45/practice
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_9mm
name = "ammo clip (9mm)"
path =/obj/item/ammo_magazine/clip/c9mm
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_clip_9mmr
name = "ammo clip (9mm rubber)"
path =/obj/item/ammo_magazine/clip/c9mm/rubber
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_9mmp
name = "ammo clip (9mm practice)"
path =/obj/item/ammo_magazine/clip/c9mm/practice
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_9mmf
name = "ammo clip (9mm flash)"
path =/obj/item/ammo_magazine/clip/c9mm/flash
category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/pistol_clip_5mm
name = "ammo clip (5mm)"
path =/obj/item/ammo_magazine/clip/c5mm
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_clip_10mm
name = "ammo clip (10mm)"
path =/obj/item/ammo_magazine/clip/a10mm
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/pistol_clip_50
name = "ammo clip (.50AE)"
path =/obj/item/ammo_magazine/clip/a50
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/rifle_clip_556
name = "ammo clip (5.56mm)"
path =/obj/item/ammo_magazine/clip/a556
category = "Arms and Ammunition"
hidden = 1
/datum/category_item/autolathe/arms/rifle_clip_556_practice
name = "ammo clip (5.56mm practice)"
path =/obj/item/ammo_magazine/clip/a556/practice
category = "Arms and Ammunition"
*/
/datum/category_item/autolathe/arms/rifle_clip_762
name = "ammo clip (7.62mm)"
path =/obj/item/ammo_magazine/clip/a762
hidden = 1
/datum/category_item/autolathe/arms/rifle_clip_762_practice
name = "ammo clip (7.62mm practice)"
path =/obj/item/ammo_magazine/clip/a762/practice
/datum/category_item/autolathe/arms/knuckledusters
name = "knuckle dusters"
path =/obj/item/weapon/material/knuckledusters
hidden = 1
/datum/category_item/autolathe/arms/tacknife
name = "tactical knife"
path =/obj/item/weapon/material/hatchet/tacknife
hidden = 1
/datum/category_item/autolathe/arms/flamethrower
name = "flamethrower"
path =/obj/item/weapon/flamethrower/full
hidden = 1

View File

@@ -0,0 +1,71 @@
var/datum/category_collection/autolathe/autolathe_recipes
/datum/category_item/autolathe/New()
..()
var/obj/item/I = new path()
if(I.matter && !resources)
resources = list()
for(var/material in I.matter)
resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle.
if(is_stack && istype(I, /obj/item/stack))
var/obj/item/stack/IS = I
max_stack = IS.max_amount
qdel(I)
/****************************
* Category Collection Setup *
****************************/
/datum/category_collection/autolathe
category_group_type = /datum/category_group/autolathe
/*************
* Categories *
*************/
/datum/category_group/autolathe
/datum/category_group/autolathe/all
name = "All"
category_item_type = /datum/category_item/autolathe
///datum/category_group/autolathe/all/New()
/datum/category_group/autolathe/arms
name = "Arms and Ammunition"
category_item_type = /datum/category_item/autolathe/arms
/datum/category_group/autolathe/devices
name = "Devices and Components"
category_item_type = /datum/category_item/autolathe/devices
/datum/category_group/autolathe/engineering
name = "Engineering"
category_item_type = /datum/category_item/autolathe/engineering
/datum/category_group/autolathe/general
name = "General"
category_item_type = /datum/category_item/autolathe/general
/datum/category_group/autolathe/medical
name = "Medical"
category_item_type = /datum/category_item/autolathe/medical
/datum/category_group/autolathe/tools
name = "Tools"
category_item_type = /datum/category_item/autolathe/tools
/*******************
* Category entries *
*******************/
/datum/category_item/autolathe
var/path
var/list/resources
var/hidden
var/power_use = 0
var/is_stack
var/max_stack
/datum/category_item/autolathe/dd_SortValue()
return name

View File

@@ -0,0 +1,32 @@
/datum/category_item/autolathe/devices/consolescreen
name = "console screen"
path =/obj/item/weapon/stock_parts/console_screen
/datum/category_item/autolathe/devices/igniter
name = "igniter"
path =/obj/item/device/assembly/igniter
/datum/category_item/autolathe/devices/signaler
name = "signaler"
path =/obj/item/device/assembly/signaler
/datum/category_item/autolathe/devices/sensor_infra
name = "infrared sensor"
path =/obj/item/device/assembly/infra
/datum/category_item/autolathe/devices/timer
name = "timer"
path =/obj/item/device/assembly/timer
/datum/category_item/autolathe/devices/sensor_prox
name = "proximity sensor"
path =/obj/item/device/assembly/prox_sensor
/datum/category_item/autolathe/devices/beartrap
name = "mechanical trap"
path =/obj/item/weapon/beartrap
/datum/category_item/autolathe/devices/electropack
name = "electropack"
path =/obj/item/device/radio/electropack
hidden = 1

View File

@@ -0,0 +1,95 @@
/datum/category_item/autolathe/engineering/airlockmodule
name = "airlock electronics"
path =/obj/item/weapon/airlock_electronics
/datum/category_item/autolathe/engineering/airalarm
name = "air alarm electronics"
path =/obj/item/weapon/circuitboard/airalarm
/datum/category_item/autolathe/engineering/firealarm
name = "fire alarm electronics"
path =/obj/item/weapon/circuitboard/firealarm
/datum/category_item/autolathe/engineering/powermodule
name = "power control module"
path =/obj/item/weapon/module/power_control
/datum/category_item/autolathe/engineering/statusdisplay
name = "status display electronics"
path =/obj/item/weapon/circuitboard/status_display
/datum/category_item/autolathe/engineering/aistatusdisplay
name = "ai status display electronics"
path =/obj/item/weapon/circuitboard/ai_status_display
/datum/category_item/autolathe/engineering/newscaster
name = "newscaster electronics"
path =/obj/item/weapon/circuitboard/newscaster
/datum/category_item/autolathe/engineering/atm
name = "atm electronics"
path =/obj/item/weapon/circuitboard/atm
/datum/category_item/autolathe/engineering/intercom
name = "intercom electronics"
path =/obj/item/weapon/circuitboard/intercom
/datum/category_item/autolathe/engineering/holopad
name = "holopad electronics"
path =/obj/item/weapon/circuitboard/holopad
/datum/category_item/autolathe/engineering/guestpass
name = "guestpass console electronics"
path =/obj/item/weapon/circuitboard/guestpass
/datum/category_item/autolathe/engineering/entertainment
name = "entertainment camera electronics"
path =/obj/item/weapon/circuitboard/security/telescreen/entertainment
/datum/category_item/autolathe/engineering/keycard
name = "keycard authenticator electronics"
path =/obj/item/weapon/circuitboard/keycard_auth
/datum/category_item/autolathe/engineering/photocopier
name = "photocopier electronics"
path =/obj/item/weapon/circuitboard/photocopier
/datum/category_item/autolathe/engineering/fax
name = "fax machine electronics"
path =/obj/item/weapon/circuitboard/fax
/datum/category_item/autolathe/engineering/microwave
name = "microwave electronics"
path =/obj/item/weapon/circuitboard/microwave
/datum/category_item/autolathe/engineering/washing
name = "washing machine electronics"
path =/obj/item/weapon/circuitboard/washing
/datum/category_item/autolathe/engineering/request
name = "request console electronics"
path =/obj/item/weapon/circuitboard/request
/datum/category_item/autolathe/engineering/motor
name = "motor"
path =/obj/item/weapon/stock_parts/motor
/datum/category_item/autolathe/engineering/gear
name = "gear"
path =/obj/item/weapon/stock_parts/gear
/datum/category_item/autolathe/engineering/spring
name = "spring"
path =/obj/item/weapon/stock_parts/spring
/datum/category_item/autolathe/engineering/rcd_ammo
name = "matter cartridge"
path =/obj/item/weapon/rcd_ammo
/datum/category_item/autolathe/engineering/rcd
name = "rapid construction device"
path =/obj/item/weapon/rcd
/datum/category_item/autolathe/engineering/camera_assembly
name = "camera assembly"
path =/obj/item/weapon/camera_assembly

View File

@@ -0,0 +1,124 @@
/datum/category_item/autolathe/general/bucket
name = "bucket"
path =/obj/item/weapon/reagent_containers/glass/bucket
/datum/category_item/autolathe/general/cooler_bottle
name = "water-cooler bottle"
path =/obj/item/weapon/reagent_containers/glass/cooler_bottle
/datum/category_item/autolathe/general/drinkingglass_square
name = "half-pint glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/square
/datum/category_item/autolathe/general/drinkingglass_rocks
name = "rocks glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks
/datum/category_item/autolathe/general/drinkingglass_shake
name = "milkshake glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/shake
/datum/category_item/autolathe/general/drinkingglass_cocktail
name = "cocktail glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail
/datum/category_item/autolathe/general/drinkingglass_shot
name = "shot glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/shot
/datum/category_item/autolathe/general/drinkingglass_pint
name = "pint glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/pint
/datum/category_item/autolathe/general/drinkingglass_mug
name = "glass mug"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/mug
/datum/category_item/autolathe/general/drinkingglass_wine
name = "wine glass"
path =/obj/item/weapon/reagent_containers/food/drinks/glass2/wine
/datum/category_item/autolathe/general/flashlight
name = "flashlight"
path =/obj/item/device/flashlight
/datum/category_item/autolathe/general/floor_light
name = "floor light"
path =/obj/machinery/floor_light
/datum/category_item/autolathe/general/extinguisher
name = "extinguisher"
path =/obj/item/weapon/extinguisher
/datum/category_item/autolathe/general/jar
name = "jar"
path =/obj/item/glass_jar
/datum/category_item/autolathe/general/radio_headset
name = "radio headset"
path =/obj/item/device/radio/headset
/datum/category_item/autolathe/general/radio_bounced
name = "station bounced radio"
path =/obj/item/device/radio/off
/datum/category_item/autolathe/general/suit_cooler
name = "suit cooling unit"
path =/obj/item/device/suit_cooling_unit
/datum/category_item/autolathe/general/weldermask
name = "welding mask"
path =/obj/item/clothing/head/welding
/datum/category_item/autolathe/general/metal
name = "steel sheets"
path =/obj/item/stack/material/steel
is_stack = 1
/datum/category_item/autolathe/general/glass
name = "glass sheets"
path =/obj/item/stack/material/glass
is_stack = 1
/datum/category_item/autolathe/general/rglass
name = "reinforced glass sheets"
path =/obj/item/stack/material/glass/reinforced
is_stack = 1
/datum/category_item/autolathe/general/rods
name = "metal rods"
path =/obj/item/stack/rods
is_stack = 1
/datum/category_item/autolathe/general/knife
name = "kitchen knife"
path =/obj/item/weapon/material/knife
/datum/category_item/autolathe/general/taperecorder
name = "tape recorder"
path =/obj/item/device/taperecorder
/datum/category_item/autolathe/general/tube
name = "light tube"
path =/obj/item/weapon/light/tube
/datum/category_item/autolathe/general/bulb
name = "light bulb"
path =/obj/item/weapon/light/bulb
/datum/category_item/autolathe/general/ashtray_glass
name = "glass ashtray"
path =/obj/item/weapon/material/ashtray/glass
/datum/category_item/autolathe/general/weldinggoggles
name = "welding goggles"
path =/obj/item/clothing/glasses/welding
/datum/category_item/autolathe/general/maglight
name = "maglight"
path =/obj/item/device/flashlight/maglight
/datum/category_item/autolathe/general/handcuffs
name = "handcuffs"
path =/obj/item/weapon/handcuffs
hidden = 1

View File

@@ -0,0 +1,39 @@
/datum/category_item/autolathe/medical/scalpel
name = "scalpel"
path =/obj/item/weapon/scalpel
/datum/category_item/autolathe/medical/circularsaw
name = "circular saw"
path =/obj/item/weapon/circular_saw
/datum/category_item/autolathe/medical/surgicaldrill
name = "surgical drill"
path =/obj/item/weapon/surgicaldrill
/datum/category_item/autolathe/medical/retractor
name = "retractor"
path =/obj/item/weapon/retractor
/datum/category_item/autolathe/medical/cautery
name = "cautery"
path =/obj/item/weapon/cautery
/datum/category_item/autolathe/medical/hemostat
name = "hemostat"
path =/obj/item/weapon/hemostat
/datum/category_item/autolathe/medical/beaker
name = "glass beaker"
path =/obj/item/weapon/reagent_containers/glass/beaker
/datum/category_item/autolathe/medical/beaker_large
name = "large glass beaker"
path =/obj/item/weapon/reagent_containers/glass/beaker/large
/datum/category_item/autolathe/medical/vial
name = "glass vial"
path =/obj/item/weapon/reagent_containers/glass/beaker/vial
/datum/category_item/autolathe/medical/syringe
name = "syringe"
path =/obj/item/weapon/reagent_containers/syringe

View File

@@ -0,0 +1,39 @@
/datum/category_item/autolathe/tools/crowbar
name = "crowbar"
path =/obj/item/weapon/crowbar
/datum/category_item/autolathe/tools/multitool
name = "multitool"
path =/obj/item/device/multitool
/datum/category_item/autolathe/tools/t_scanner
name = "T-ray scanner"
path =/obj/item/device/t_scanner
/datum/category_item/autolathe/tools/weldertool
name = "welding tool"
path =/obj/item/weapon/weldingtool
/datum/category_item/autolathe/tools/screwdriver
name = "screwdriver"
path =/obj/item/weapon/screwdriver
/datum/category_item/autolathe/tools/wirecutters
name = "wirecutters"
path =/obj/item/weapon/wirecutters
/datum/category_item/autolathe/tools/wrench
name = "wrench"
path =/obj/item/weapon/wrench
/datum/category_item/autolathe/tools/hatchet
name = "hatchet"
path =/obj/item/weapon/material/hatchet
/datum/category_item/autolathe/tools/minihoe
name = "mini hoe"
path =/obj/item/weapon/material/minihoe
/datum/category_item/autolathe/tools/welder_industrial
name = "industrial welding tool"
path =/obj/item/weapon/weldingtool/largetank

View File

@@ -228,6 +228,8 @@
L.fields["faction"] = H.personal_faction
L.fields["religion"] = H.religion
L.fields["image"] = getFlatIcon(H) //This is god-awful
L.fields["antagfac"] = H.antag_faction
L.fields["antagvis"] = H.antag_vis
if(H.exploit_record && !jobban_isbanned(H, "Records"))
L.fields["exploit_record"] = H.exploit_record
else

30
code/datums/hierarchy.dm Normal file
View File

@@ -0,0 +1,30 @@
/decl/hierarchy
var/name = "Hierarchy"
var/hierarchy_type
var/decl/hierarchy/parent
var/list/decl/hierarchy/children
/decl/hierarchy/New(var/full_init = TRUE)
children = list()
if(!full_init)
return
var/list/all_subtypes = list()
all_subtypes[type] = src
for(var/subtype in subtypesof(type))
all_subtypes[subtype] = new subtype(FALSE)
for(var/subtype in (all_subtypes - type))
var/decl/hierarchy/subtype_instance = all_subtypes[subtype]
var/decl/hierarchy/subtype_parent = all_subtypes[subtype_instance.parent_type]
subtype_instance.parent = subtype_parent
dd_insertObjectList(subtype_parent.children, subtype_instance)
/decl/hierarchy/proc/is_category()
return hierarchy_type == type || children.len
/decl/hierarchy/proc/is_hidden_category()
return hierarchy_type == type
/decl/hierarchy/dd_SortValue()
return name

View File

@@ -52,7 +52,7 @@
/datum/supply_packs/atmos/canister_sleeping_agent
name = "N2O gas canister"
cost = 40
cost = 15
containername = "N2O gas canister crate"
containertype = /obj/structure/closet/crate/secure/large
access = access_atmospherics
@@ -60,7 +60,7 @@
/datum/supply_packs/atmos/canister_carbon_dioxide
name = "Carbon dioxide gas canister"
cost = 40
cost = 15
containername = "CO2 canister crate"
containertype = /obj/structure/closet/crate/secure/large
access = access_atmospherics
@@ -69,7 +69,7 @@
/datum/supply_packs/atmos/air_dispenser
contains = list(/obj/machinery/pipedispenser/orderable)
name = "Pipe Dispenser"
cost = 35
cost = 25
containertype = /obj/structure/closet/crate/secure/large
containername = "Pipe Dispenser Crate"
access = access_atmospherics
@@ -77,7 +77,32 @@
/datum/supply_packs/atmos/disposals_dispenser
contains = list(/obj/machinery/pipedispenser/disposal/orderable)
name = "Disposals Pipe Dispenser"
cost = 35
cost = 25
containertype = /obj/structure/closet/crate/secure/large
containername = "Disposal Dispenser Crate"
access = access_atmospherics
access = access_atmospherics
/datum/supply_packs/atmos/internals
name = "Internals crate"
contains = list(
/obj/item/clothing/mask/gas = 3,
/obj/item/weapon/tank/air = 3
)
cost = 10
containertype = /obj/structure/closet/crate/internals
containername = "Internals crate"
/datum/supply_packs/atmos/evacuation
name = "Emergency equipment"
contains = list(
/obj/item/weapon/storage/toolbox/emergency = 2,
/obj/item/clothing/suit/storage/hazardvest = 2,
/obj/item/clothing/suit/storage/vest = 2,
/obj/item/weapon/tank/emergency_oxygen/engi = 4,
/obj/item/clothing/suit/space/emergency = 4,
/obj/item/clothing/head/helmet/space/emergency = 4,
/obj/item/clothing/mask/gas = 4
)
cost = 35
containertype = /obj/structure/closet/crate/internals
containername = "Emergency crate"

View File

@@ -14,7 +14,7 @@
)
name = "Contraband crate"
cost = 30
cost = 25
containertype = /obj/structure/closet/crate
containername = "Unlabeled crate"
contraband = 1
@@ -28,10 +28,10 @@
/obj/item/weapon/pen/reagent/paralysis,
/obj/item/weapon/grenade/chem_grenade/incendiary
)
cost = 20
cost = 25
containertype = /obj/structure/closet/crate
containername = "Special Ops crate"
hidden = 1
contraband = 1
/datum/supply_packs/security/bolt_rifles_mosin
name = "Surplus militia rifles"
@@ -40,6 +40,6 @@
/obj/item/ammo_magazine/clip/a762 = 6
)
cost = 50
hidden = 1
contraband = 1
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate"

View File

@@ -124,7 +124,7 @@ datum/supply_packs/costumes/witch
/datum/supply_packs/randomised/costumes/costume_hats
name = "Costume hats"
containername = "Actor hats crate"
containertype = /obj/structure/closet
containertype = /obj/structure/closet/crate
cost = 10
num_contained = 3
contains = list(

View File

@@ -29,7 +29,7 @@
/obj/item/weapon/cell = 2,
/obj/item/weapon/cell/high = 2
)
cost = 15
cost = 10
containertype = /obj/structure/closet/crate
containername = "Electrical maintenance crate"
@@ -48,7 +48,7 @@
/datum/supply_packs/eng/fueltank
name = "Fuel tank crate"
contains = list(/obj/structure/reagent_dispensers/fueltank)
cost = 8
cost = 10
containertype = /obj/structure/largecrate
containername = "fuel tank crate"
@@ -72,7 +72,7 @@
containername = "Emitter crate"
access = access_ce
/datum/supply_packs/engine/eng/field_gen
/datum/supply_packs/eng/engine/field_gen
name = "Field Generator crate"
contains = list(/obj/machinery/field_generator = 2)
containertype = /obj/structure/closet/crate/secure
@@ -110,7 +110,7 @@
/datum/supply_packs/eng/shield_gen
contains = list(/obj/item/weapon/circuitboard/shield_gen)
name = "Bubble shield generator circuitry"
cost = 50
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "bubble shield generator circuitry crate"
access = access_ce
@@ -118,7 +118,7 @@
/datum/supply_packs/eng/shield_gen_ex
contains = list(/obj/item/weapon/circuitboard/shield_gen_ex)
name = "Hull shield generator circuitry"
cost = 50
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "hull shield generator circuitry crate"
access = access_ce
@@ -126,7 +126,7 @@
/datum/supply_packs/eng/shield_cap
contains = list(/obj/item/weapon/circuitboard/shield_cap)
name = "Bubble shield capacitor circuitry"
cost = 50
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "shield capacitor circuitry crate"
access = access_ce
@@ -142,7 +142,7 @@
/datum/supply_packs/eng/teg
contains = list(/obj/machinery/power/generator)
name = "Mark I Thermoelectric Generator"
cost = 75
cost = 50
containertype = /obj/structure/closet/crate/secure/large
containername = "Mk1 TEG crate"
access = access_engine
@@ -150,7 +150,7 @@
/datum/supply_packs/eng/circulator
contains = list(/obj/machinery/atmospherics/binary/circulator)
name = "Binary atmospheric circulator"
cost = 60
cost = 50
containertype = /obj/structure/closet/crate/secure/large
containername = "Atmospheric circulator crate"
access = access_engine
@@ -167,7 +167,7 @@
/datum/supply_packs/eng/pacman_parts
name = "P.A.C.M.A.N. portable generator parts"
cost = 45
cost = 25
containername = "P.A.C.M.A.N. Portable Generator Construction Kit"
containertype = /obj/structure/closet/crate/secure
access = access_tech_storage
@@ -180,7 +180,7 @@
/datum/supply_packs/eng/super_pacman_parts
name = "Super P.A.C.M.A.N. portable generator parts"
cost = 55
cost = 35
containername = "Super P.A.C.M.A.N. portable generator construction kit"
containertype = /obj/structure/closet/crate/secure
access = access_tech_storage

View File

@@ -22,7 +22,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 2,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 4,
)
cost = 20
cost = 10
containertype = /obj/structure/closet/crate
containername = "Party equipment"

View File

@@ -17,21 +17,21 @@
/datum/supply_packs/hydro/farwa
name = "Farwa crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/farwacubes)
cost = 30
cost = 20
containertype = /obj/structure/closet/crate/freezer
containername = "Farwa crate"
/datum/supply_packs/hydro/neara
name = "Neaera crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/neaeracubes)
cost = 30
cost = 20
containertype = /obj/structure/closet/crate/freezer
containername = "Neaera crate"
/datum/supply_packs/hydro/stok
name = "Stok crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/stokcubes)
cost = 30
cost = 20
containertype = /obj/structure/closet/crate/freezer
containername = "Stok crate"
@@ -55,14 +55,14 @@
/obj/item/weapon/material/minihoe,
/obj/item/weapon/storage/box/botanydisk
)
cost = 15
cost = 20
containertype = /obj/structure/closet/crate/hydroponics
containername = "Hydroponics crate"
access = access_hydroponics
/datum/supply_packs/hydro/cow
name = "Cow crate"
cost = 30
cost = 25
containertype = /obj/structure/largecrate/animal/cow
containername = "Cow crate"
access = access_hydroponics
@@ -76,7 +76,7 @@
/datum/supply_packs/hydro/chicken
name = "Chicken crate"
cost = 20
cost = 25
containertype = /obj/structure/largecrate/animal/chick
containername = "Chicken crate"
access = access_hydroponics
@@ -123,7 +123,7 @@
/datum/supply_packs/hydro/watertank
name = "Water tank crate"
contains = list(/obj/structure/reagent_dispensers/watertank)
cost = 8
cost = 10
containertype = /obj/structure/largecrate
containername = "water tank crate"
@@ -142,7 +142,7 @@
/datum/supply_packs/hydro/tray
name = "Empty hydroponics tray"
cost = 30
cost = 20
containertype = /obj/structure/closet/crate/hydroponics
containername = "Hydroponics tray crate"
contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0})

View File

@@ -9,40 +9,35 @@
/datum/supply_packs/materials/metal50
name = "50 metal sheets"
contains = list(/obj/item/stack/material/steel)
amount = 50
contains = list(/obj/item/stack/material/steel/fifty)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Metal sheets crate"
/datum/supply_packs/materials/glass50
name = "50 glass sheets"
contains = list(/obj/item/stack/material/glass)
amount = 50
contains = list(/obj/item/stack/material/glass/fifty)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Glass sheets crate"
/datum/supply_packs/materials/wood50
name = "50 wooden planks"
contains = list(/obj/item/stack/material/wood)
amount = 50
contains = list(/obj/item/stack/material/wood/fifty)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Wooden planks crate"
/datum/supply_packs/materials/plastic50
name = "50 plastic sheets"
contains = list(/obj/item/stack/material/plastic)
amount = 50
contains = list(/obj/item/stack/material/plastic/fifty)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Plastic sheets crate"
/datum/supply_packs/materials/cardboard_sheets
contains = list(/obj/item/stack/material/cardboard)
contains = list(/obj/item/stack/material/cardboard/fifty)
name = "50 cardboard sheets"
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Cardboard sheets crate"
@@ -53,10 +48,9 @@
containername = "Imported carpet crate"
cost = 15
contains = list(
/obj/item/stack/tile/carpet,
/obj/item/stack/tile/carpet/blue
/obj/item/stack/tile/carpet/fifty,
/obj/item/stack/tile/carpet/blue/fifty
)
amount = 50
/datum/supply_packs/misc/linoleum
@@ -64,5 +58,4 @@
containertype = /obj/structure/closet/crate
containername = "Linoleum crate"
cost = 15
contains = list(/obj/item/stack/tile/linoleum)
amount = 50
contains = list(/obj/item/stack/tile/linoleum/fifty)

View File

@@ -42,7 +42,7 @@
/datum/supply_packs/med/cryobag
name = "Stasis bag crate"
contains = list(/obj/item/bodybag/cryobag = 3)
cost = 50
cost = 40
containertype = /obj/structure/closet/crate/medical
containername = "Stasis bag crate"
@@ -75,7 +75,7 @@
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/storage/belt/medical = 3
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Sterile equipment crate"
@@ -87,7 +87,7 @@
/obj/item/device/radio/headset/headset_med/alt = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical surplus equipment"
access = access_medical
@@ -111,7 +111,7 @@
/obj/item/device/flashlight/pen,
/obj/item/weapon/reagent_containers/syringe
)
cost = 60
cost = 50
containertype = "/obj/structure/closet/crate/secure"
containername = "Chief medical officer equipment"
access = access_cmo
@@ -157,7 +157,7 @@
/obj/item/weapon/storage/box/pillbottles,
/obj/item/weapon/reagent_containers/syringe
)
cost = 15
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Chemist equipment"
access = access_chemistry
@@ -204,7 +204,7 @@
/obj/item/weapon/pen,
/obj/item/weapon/cartridge/medical
)
cost = 15
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Psychiatrist equipment"
access = access_psychiatrist
@@ -225,7 +225,7 @@
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical scrubs crate"
access = access_medical_equip
@@ -269,7 +269,7 @@
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical uniform crate"
access = access_medical_equip

View File

@@ -67,31 +67,6 @@
/obj/item/clothing/accessory/storage/white_drop_pouches,
/obj/item/clothing/accessory/storage/webbing
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Webbing crate"
/datum/supply_packs/atmos/internals
name = "Internals crate"
contains = list(
/obj/item/clothing/mask/gas = 3,
/obj/item/weapon/tank/air = 3
)
cost = 10
containertype = /obj/structure/closet/crate/internals
containername = "Internals crate"
/datum/supply_packs/atmos/evacuation
name = "Emergency equipment"
contains = list(
/obj/item/weapon/storage/toolbox/emergency = 2,
/obj/item/clothing/suit/storage/hazardvest = 2,
/obj/item/clothing/suit/storage/vest = 2,
/obj/item/weapon/tank/emergency_oxygen/engi = 4,
/obj/item/clothing/suit/space/emergency = 4,
/obj/item/clothing/head/helmet/space/emergency = 4,
/obj/item/clothing/mask/gas = 4
)
cost = 45
containertype = /obj/structure/closet/crate/internals
containername = "Emergency crate"

View File

@@ -40,7 +40,7 @@
contains = list(
/obj/item/weapon/gun/energy/xray = 2,
/obj/item/weapon/shield/energy = 2)
cost = 125
cost = 100
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Experimental weapons crate"
access = access_armory
@@ -60,7 +60,7 @@
/obj/item/weapon/storage/box/shotgunshells,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 2
)
cost = 65
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "Shotgun crate"
access = access_armory
@@ -68,7 +68,7 @@
/datum/supply_packs/munitions/erifle
name = "Energy marksman crate"
contains = list(/obj/item/weapon/gun/energy/sniperrifle = 2)
cost = 90
cost = 100
containertype = /obj/structure/closet/crate/secure
containername = "Energy marksman crate"
access = access_armory
@@ -91,7 +91,7 @@
/obj/item/weapon/gun/projectile/automatic/wt550,
/obj/item/weapon/gun/projectile/automatic/z8
)
cost = 90
cost = 100
containertype = /obj/structure/closet/crate/secure
containername = "Automatic weapon crate"
access = access_armory
@@ -119,12 +119,12 @@
containername = "Weapons crate"
/datum/supply_packs/munitions/shotgunammo
name = "Ballistic ammunition crate"
name = "Shotgun ammunition crate"
contains = list(
/obj/item/weapon/storage/box/shotgunammo = 2,
/obj/item/weapon/storage/box/shotgunshells = 2
)
cost = 60
cost = 25
containertype = /obj/structure/closet/crate/secure
containername = "ballistic ammunition crate"
access = access_armory
@@ -137,7 +137,7 @@
/obj/item/ammo_magazine/mc9mmt/rubber,
/obj/item/ammo_magazine/a556
)
cost = 20
cost = 25
containertype = /obj/structure/closet/crate/secure
containername = "Automatic weapon ammunition crate"
access = access_armory
@@ -145,7 +145,7 @@
/datum/supply_packs/munitions/beanbagammo
name = "Beanbag shells"
contains = list(/obj/item/weapon/storage/box/beanbags = 3)
cost = 30
cost = 25
containertype = /obj/structure/closet/crate
containername = "Beanbag shells"
access = null

View File

@@ -19,7 +19,7 @@
/obj/item/weapon/material/twohanded/spear/foam = 2,
/obj/item/weapon/material/twohanded/fireaxe/foam = 2
)
cost = 80
cost = 50
containertype = /obj/structure/closet/crate
containername = "foam weapon crate"
@@ -33,7 +33,7 @@
)
containertype = /obj/structure/closet
containername = "Lasertag Closet"
cost = 20
cost = 10
/datum/supply_packs/recreation/artscrafts
name = "Arts and Crafts supplies"

View File

@@ -11,7 +11,7 @@
group = "Robotics"
access = access_robotics
/datum/supply_packs/eng/robotics
/datum/supply_packs/robotics/robotics_assembly
name = "Robotics assembly crate"
contains = list(
/obj/item/device/assembly/prox_sensor = 3,
@@ -58,7 +58,7 @@
/obj/item/weapon/circuitboard/mecha/ripley/main,
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
)
cost = 30
cost = 25
containertype = /obj/structure/closet/crate/secure
containername = "APLU \"Ripley\" Circuit Crate"
access = access_robotics

View File

@@ -8,17 +8,20 @@
/datum/supply_packs/sci/coolanttank
name = "Coolant tank crate"
contains = list(/obj/structure/reagent_dispensers/coolanttank)
cost = 16
cost = 15
containertype = /obj/structure/largecrate
containername = "coolant tank crate"
/datum/supply_packs/sci/phoron
name = "Phoron assembly crate"
name = "Phoron research crate"
contains = list(
/obj/item/weapon/tank/phoron = 3,
/obj/item/weapon/tank/oxygen = 3,
/obj/item/device/assembly/igniter = 3,
/obj/item/device/assembly/prox_sensor = 3,
/obj/item/device/assembly/timer = 3
/obj/item/device/assembly/timer = 3,
/obj/item/device/assembly/signaler = 3,
/obj/item/device/transfer_valve = 3
)
cost = 10
containertype = /obj/structure/closet/crate/secure/phoron

View File

@@ -82,7 +82,7 @@
/obj/item/clothing/gloves/arm_guard/bulletproof,
/obj/item/clothing/shoes/leg_guard/bulletproof
)
cost = 35
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "bullet resistant armor set crate"
access = access_armory
@@ -104,7 +104,7 @@
name = "Tactical suits"
containertype = /obj/structure/closet/crate/secure
containername = "Tactical Suit Locker"
cost = 60
cost = 40
access = access_armory
contains = list(
/obj/item/clothing/under/tactical,
@@ -162,7 +162,7 @@
/obj/item/device/radio/headset/headset_sec/alt = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 3
)
cost = 25
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Security surplus equipment"
access = null
@@ -189,7 +189,7 @@
/obj/item/device/flashlight/maglight,
/obj/item/weapon/storage/briefcase/crimekit
)
cost = 40
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Forensic equipment"
access = access_forensics_lockers
@@ -210,7 +210,7 @@
/obj/item/clothing/accessory/badge/holo/detective = 2,
/obj/item/clothing/gloves/black = 2
)
cost = 20
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Investigation clothing"
access = access_forensics_lockers
@@ -240,7 +240,7 @@
/obj/item/weapon/gun/energy/taser,
/obj/item/device/flashlight/maglight
)
cost = 30
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Officer equipment"
access = access_brig
@@ -251,8 +251,8 @@
/obj/item/clothing/suit/storage/vest/warden,
/obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/warden/corp,
/obj/item/clothing/suit/armor/vest/warden,
/obj/item/clothing/suit/armor/vest/warden/alt,
/obj/item/clothing/suit/storage/vest/wardencoat,
/obj/item/clothing/suit/storage/vest/wardencoat/alt,
/obj/item/clothing/head/helmet/warden,
/obj/item/weapon/cartridge/security,
/obj/item/device/radio/headset/headset_sec,
@@ -268,7 +268,7 @@
/obj/item/clothing/head/beret/sec/corporate/warden,
/obj/item/device/flashlight/maglight
)
cost = 45
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Warden equipment"
access = access_armory
@@ -279,7 +279,7 @@
/obj/item/clothing/head/helmet/HoS,
/obj/item/clothing/suit/storage/vest/hos,
/obj/item/clothing/under/rank/head_of_security/corp,
/obj/item/clothing/suit/armor/hos,
/obj/item/clothing/suit/storage/vest/hoscoat,
/obj/item/clothing/head/helmet/HoS/dermal,
/obj/item/weapon/cartridge/hos,
/obj/item/device/radio/headset/heads/hos,
@@ -294,7 +294,7 @@
/obj/item/clothing/head/beret/sec/corporate/hos,
/obj/item/device/flashlight/maglight
)
cost = 65
cost = 50
containertype = "/obj/structure/closet/crate/secure"
containername = "Head of security equipment"
access = access_hos
@@ -309,12 +309,11 @@
/obj/item/clothing/under/rank/security2 = 4,
/obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/head_of_security,
/obj/item/clothing/suit/armor/hos/jensen,
/obj/item/clothing/head/soft/sec = 4,
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Security uniform crate"
@@ -335,7 +334,7 @@
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Navy blue security uniform crate"
@@ -355,21 +354,22 @@
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Corporate security uniform crate"
/datum/supply_packs/security/biosuit
name = "Security biohazard gear"
contains = list(
/obj/item/clothing/head/bio_hood/security,
/obj/item/clothing/under/rank/security,
/obj/item/clothing/suit/bio_suit/security,
/obj/item/clothing/shoes/white,
/obj/item/clothing/mask/gas,
/obj/item/weapon/tank/oxygen,
/obj/item/clothing/gloves/latex
/obj/item/clothing/head/bio_hood/security = 3,
/obj/item/clothing/under/rank/security = 3,
/obj/item/clothing/suit/bio_suit/security = 3,
/obj/item/clothing/shoes/white = 3,
/obj/item/clothing/mask/gas = 3,
/obj/item/weapon/tank/oxygen = 3,
/obj/item/clothing/gloves/latex,
/obj/item/weapon/storage/box/gloves
)
cost = 35
cost = 50
containertype = "/obj/structure/closet/crate/secure"
containername = "Security biohazard gear"

View File

@@ -50,12 +50,19 @@
containertype = /obj/structure/closet/crate
containername = "Janitorial supplies"
/datum/supply_packs/supply/boxes
name = "Empty boxes"
contains = list(/obj/item/weapon/storage/box = 10)
/datum/supply_packs/supply/shipping
name = "Shipping supplies"
contains = list(
/obj/item/stack/material/cardboard/fifty,
/obj/item/weapon/packageWrap = 4,
/obj/item/weapon/wrapping_paper = 2,
/obj/item/device/destTagger,
/obj/item/weapon/hand_labeler,
/obj/item/weapon/wirecutters,
/obj/item/weapon/tape_roll = 2)
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Empty box crate"
containername = "Shipping supplies crate"
/datum/supply_packs/supply/bureaucracy
contains = list(
@@ -103,7 +110,7 @@
/obj/item/clothing/glasses/material,
/obj/item/clothing/glasses/meson
)
cost = 15
cost = 10
containertype = "/obj/structure/closet/crate/secure"
containername = "Shaft miner equipment"
access = access_mining
@@ -118,7 +125,7 @@
/datum/supply_packs/supply/cargotrain
name = "Cargo Train Tug"
contains = list(/obj/vehicle/train/cargo/engine)
cost = 45
cost = 35
containertype = /obj/structure/largecrate
containername = "Cargo Train Tug Crate"

View File

@@ -28,7 +28,6 @@ var/list/all_supply_groups = list("Atmospherics",
var/name = null
var/list/contains = list()
var/manifest = ""
var/amount = null
var/cost = null
var/containertype = null
var/containername = null

View File

@@ -16,7 +16,7 @@
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2,
)
cost = 45
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Atmospheric voidsuit crate"
access = access_atmospherics
@@ -58,7 +58,7 @@
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 55
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Security voidsuit crate"
@@ -70,7 +70,7 @@
/obj/item/clothing/mask/breath = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 35
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Mining voidsuit crate"
access = access_mining

View File

@@ -2,8 +2,9 @@
* Ammunition *
*************/
/datum/uplink_item/item/ammo
item_cost = 2
item_cost = 20
category = /datum/uplink_category/ammunition
blacklisted = 1
/datum/uplink_item/item/ammo/a357
name = ".357 Speedloader"
@@ -41,7 +42,7 @@
/datum/uplink_item/item/ammo/a556/ap
name = "10rnd Rifle Magazine (5.56mm AP)"
path = /obj/item/ammo_magazine/a556/ap
/*
/datum/uplink_item/item/ammo/a556m
name = "20rnd Rifle Magazine (5.56mm)"
path = /obj/item/ammo_magazine/a556m
@@ -51,7 +52,7 @@
name = "20rnd Rifle Magazine (5.56mm AP)"
path = /obj/item/ammo_magazine/a556m/ap
item_cost = 4
*/
/datum/uplink_item/item/ammo/c762
name = "20rnd Rifle Magazine (7.62mm)"
path = /obj/item/ammo_magazine/c762
@@ -63,7 +64,7 @@
/datum/uplink_item/item/ammo/s762
name = "10rnd Rifle Magazine (7.62mm)"
path = /obj/item/ammo_magazine/s762
item_cost = 1 // Half the capacity.
item_cost = 10 // Half the capacity.
/datum/uplink_item/item/ammo/s762/ap
name = "10rnd Rifle Magazine (7.62mm AP)"
@@ -88,7 +89,7 @@
/datum/uplink_item/item/ammo/g12/beanbag
name = "12g Auto-Shotgun Magazine (Beanbag)"
path = /obj/item/ammo_magazine/g12/beanbag
item_cost = 1 // Discount due to it being LTL.
item_cost = 10 // Discount due to it being LTL.
/datum/uplink_item/item/ammo/g12/pellet
name = "12g Auto-Shotgun Magazine (Pellet)"

View File

@@ -3,6 +3,7 @@
*****************/
/datum/uplink_item/abstract/announcements
category = /datum/uplink_category/services
blacklisted = 1
/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user)
. = ..()
@@ -10,7 +11,7 @@
log_and_message_admins("has triggered a falsified [src]", user)
/datum/uplink_item/abstract/announcements/fake_centcom
item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2
item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 3
/datum/uplink_item/abstract/announcements/fake_centcom/New()
..()
@@ -33,7 +34,7 @@
/datum/uplink_item/abstract/announcements/fake_crew_arrival
name = "Crew Arrival Announcement/Records"
desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
item_cost = 4
item_cost = 30
/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
if(!user)
@@ -91,7 +92,7 @@
/datum/uplink_item/abstract/announcements/fake_ion_storm
name = "Ion Storm Announcement"
desc = "Interferes with the station's ion sensors. Triggers immediately upon investment."
item_cost = 1
item_cost = 10
/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc)
ion_storm_announcement()
@@ -100,7 +101,7 @@
/datum/uplink_item/abstract/announcements/fake_radiation
name = "Radiation Storm Announcement"
desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment."
item_cost = 3
item_cost = 15
/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc)
var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0)

View File

@@ -6,10 +6,10 @@
/datum/uplink_item/item/armor/combat
name = "Combat Armor Set"
item_cost = 5
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/combat_armor
/datum/uplink_item/item/armor/heavy_vest
name = "Heavy Armor Vest"
item_cost = 4
item_cost = 40
path = /obj/item/clothing/suit/storage/vest/heavy/merc

View File

@@ -19,6 +19,7 @@
/datum/uplink_item/item/badassery/random_one
name = "Random Item"
desc = "Buys you one random item."
blacklisted = 1
/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
@@ -53,17 +54,32 @@
****************/
/datum/uplink_item/item/badassery/surplus
name = "Surplus Crate"
item_cost = 40
var/item_worth = 60
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
var/item_worth = 240
var/icon
/datum/uplink_item/item/badassery/surplus/merc2
name = "Surplus Crate - 240 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 2
item_worth = 360
/datum/uplink_item/item/badassery/surplus/merc4
name = "Surplus Crate - 480 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4
item_worth = 720
/datum/uplink_item/item/badassery/surplus/merc6
name = "Surplus Crate - 720 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 6
item_worth = 1440
/datum/uplink_item/item/badassery/surplus/New()
..()
desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers."
/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc)
var/obj/structure/largecrate/C = new(loc)
var/random_items = get_random_uplink_items(null, item_worth, C)
var/random_items = get_surplus_items(null, item_worth, C)
for(var/datum/uplink_item/I in random_items)
I.purchase_log(U)
I.get_goods(U, C)

View File

@@ -5,31 +5,65 @@
category = /datum/uplink_category/grenades
/datum/uplink_item/item/grenades/anti_photon
name = "5xPhoton Disruption Grenades"
item_cost = 2
name = "7xPhoton Disruption Grenades"
item_cost = 10
path = /obj/item/weapon/storage/box/anti_photons
/datum/uplink_item/item/grenades/emp
name = "5xEMP Grenades"
item_cost = 3
path = /obj/item/weapon/storage/box/emps
/datum/uplink_item/item/grenades/smoke
name = "7xSmoke Grenades"
/datum/uplink_item/item/grenades/anti_photon_singular
name = "1xPhoton Disruption Grenade"
item_cost = 2
path = /obj/item/weapon/storage/box/smokes
/datum/uplink_item/item/grenades/frags
name = "5xFrag Grenades"
item_cost = 6
path = /obj/item/weapon/storage/box/frags
/datum/uplink_item/item/grenades/flashbnags
name = "7xFlashbangs"
item_cost = 4
path = /obj/item/weapon/storage/box/flashbangs
path = /obj/item/weapon/grenade/anti_photon
/datum/uplink_item/item/grenades/metalfoam
name = "7xMetal Foam Grenades"
item_cost = 3
path = /obj/item/weapon/storage/box/metalfoam
item_cost = 10
path = /obj/item/weapon/storage/box/metalfoam
/datum/uplink_item/item/grenades/metalfoam_singular
name = "1xMetal Foam Grenade"
item_cost = 2
path = /obj/item/weapon/grenade/chem_grenade/metalfoam
/datum/uplink_item/item/grenades/smoke
name = "7xSmoke Grenades"
item_cost = 10
path = /obj/item/weapon/storage/box/smokes
/datum/uplink_item/item/grenades/smoke_singular
name = "1xSmoke Grenade"
item_cost = 2
path = /obj/item/weapon/grenade/smokebomb
/datum/uplink_item/item/grenades/emp
name = "7xEMP Grenades"
item_cost = 50
path = /obj/item/weapon/storage/box/emps
/datum/uplink_item/item/grenades/emp_singular
name = "1xEMP Grenade"
item_cost = 10
path = /obj/item/weapon/grenade/empgrenade
/datum/uplink_item/item/grenades/frags
name = "7xFrag Grenades"
item_cost = 80
path = /obj/item/weapon/storage/box/frags
/datum/uplink_item/item/grenades/frags_half
name = "4x Frag Grenade"
item_cost = 50
path = /obj/item/weapon/storage/box/frags_half_box
/datum/uplink_item/item/grenades/frags_singular
name = "1x Frag Grenade"
item_cost = 15
path = /obj/item/weapon/grenade/explosive
/datum/uplink_item/item/grenades/flashbangs
name = "7xFlashbangs"
item_cost = 40
path = /obj/item/weapon/storage/box/flashbangs
/datum/uplink_item/item/grenades/flashbangs_singular
name = "1xFlashbang"
item_cost = 8

View File

@@ -3,38 +3,54 @@
*******************/
/datum/uplink_item/item/hardsuit_modules
category = /datum/uplink_category/hardsuit_modules
blacklisted = 1
/datum/uplink_item/item/hardsuit_modules/thermal
name = "Thermal Scanner"
item_cost = 2
item_cost = 15
path = /obj/item/rig_module/vision/thermal
/datum/uplink_item/item/hardsuit_modules/energy_net
name = "Net Projector"
item_cost = 3
item_cost = 20
path = /obj/item/rig_module/fabricator/energy_net
/datum/uplink_item/item/ewar_voice
/datum/uplink_item/item/hardsuit_modules/plasma_cutter
name = "Plasma Cutter"
item_cost = 20
path = /obj/item/rig_module/device/plasmacutter
/datum/uplink_item/item/hardsuit_modules/ewar_voice
name = "Electrowarfare Suite and Voice Synthesiser"
item_cost = 4
item_cost = 30
path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice
/datum/uplink_item/item/hardsuit_modules/maneuvering_jets
name = "Maneuvering Jets"
item_cost = 4
item_cost = 30
path = /obj/item/rig_module/maneuvering_jets
/datum/uplink_item/item/hardsuit_modules/egun
name = "Mounted Energy Gun"
item_cost = 6
path = /obj/item/rig_module/mounted/egun
/datum/uplink_item/item/hardsuit_modules/grenade_launcher
name = "Grenade Launcher"
item_cost = 40
path = /obj/item/rig_module/grenade_launcher
/datum/uplink_item/item/hardsuit_modules/chem_dispenser
name = "Chemical Injector"
item_cost = 40
path = /obj/item/rig_module/chem_dispenser/injector
/datum/uplink_item/item/hardsuit_modules/power_sink
name = "Power Sink"
item_cost = 6
item_cost = 45
path = /obj/item/rig_module/power_sink
/datum/uplink_item/item/hardsuit_modules/egun
name = "Mounted Energy Gun"
item_cost = 60
path = /obj/item/rig_module/mounted/egun
/datum/uplink_item/item/hardsuit_modules/laser_canon
name = "Mounted Laser Cannon"
item_cost = 8
path = /obj/item/rig_module/mounted
item_cost = 80
path = /obj/item/rig_module/mounted

View File

@@ -6,20 +6,20 @@
/datum/uplink_item/item/implants/imp_freedom
name = "Freedom Implant"
item_cost = 3
item_cost = 30
path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
/datum/uplink_item/item/implants/imp_compress
name = "Compressed Matter Implant"
item_cost = 4
item_cost = 30
path = /obj/item/weapon/storage/box/syndie_kit/imp_compress
/datum/uplink_item/item/implants/imp_explosive
name = "Explosive Implant (DANGER!)"
item_cost = 6
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
/datum/uplink_item/item/implants/imp_uplink
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
item_cost = 5 //Original cost: 10
item_cost = 50 //Original cost: 10
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink

View File

@@ -4,33 +4,37 @@
/datum/uplink_item/item/medical
category = /datum/uplink_category/medical
/datum/uplink_item/item/medical/onegativeblood
name = "O- Blood Pack"
item_cost = 5
path = /obj/item/weapon/reagent_containers/blood/OMinus
/datum/uplink_item/item/medical/sinpockets
name = "Box of Sin-Pockets"
item_cost = 1
item_cost = 5
path = /obj/item/weapon/storage/box/sinpockets
/datum/uplink_item/item/medical/surgery
name = "Surgery kit"
item_cost = 6
path = /obj/item/weapon/storage/firstaid/surgery
/datum/uplink_item/item/medical/combat
name = "Combat medical kit"
item_cost = 6
path = /obj/item/weapon/storage/firstaid/combat
/datum/uplink_item/item/medical/freezer
name = "Portable Freezer"
item_cost = 2
path = /obj/item/weapon/storage/box/freezer
/datum/uplink_item/item/medical/ambrosiaseeds
name = "Box of 7x ambrosia seed packets"
item_cost = 1
item_cost = 5
path = /obj/item/weapon/storage/box/ambrosia
/datum/uplink_item/item/medical/ambrosiadeusseeds
name = "Box of 7x ambrosia deus seed packets"
item_cost = 2
item_cost = 10
path = /obj/item/weapon/storage/box/ambrosiadeus
/datum/uplink_item/item/medical/freezer
name = "Portable Freezer"
item_cost = 10
path = /obj/item/weapon/storage/box/freezer
/datum/uplink_item/item/medical/surgery
name = "Surgery kit"
item_cost = 45
path = /obj/item/weapon/storage/firstaid/surgery
/datum/uplink_item/item/medical/combat
name = "Combat medical kit"
item_cost = 60
path = /obj/item/weapon/storage/firstaid/combat

View File

@@ -6,40 +6,35 @@
/datum/uplink_item/item/stealth_items/id
name = "Agent ID card"
item_cost = 2
item_cost = 10
path = /obj/item/weapon/card/id/syndicate
/datum/uplink_item/item/stealth_items/syndigaloshes
name = "No-Slip Shoes"
item_cost = 2
item_cost = 10
path = /obj/item/clothing/shoes/syndigaloshes
/datum/uplink_item/item/stealth_items/spy
name = "Bug Kit"
item_cost = 2
item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/spy
/datum/uplink_item/item/stealth_items/chameleon_kit
name = "Chameleon Kit"
item_cost = 3
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/chameleon
/datum/uplink_item/item/stealth_items/chameleon_projector
name = "Chameleon-Projector"
item_cost = 4
path = /obj/item/device/chameleon
/datum/uplink_item/item/stealth_items/chameleon_projector
name = "Chameleon-Projector"
item_cost = 4
item_cost = 30
path = /obj/item/device/chameleon
/datum/uplink_item/item/stealth_items/voice
name = "Voice Changer"
item_cost = 4
item_cost = 30
path = /obj/item/clothing/mask/gas/voice
/datum/uplink_item/item/stealth_items/camera_floppy
name = "Camera Network Access - Floppy"
item_cost = 6
item_cost = 30
path = /obj/item/weapon/disk/file/cameras/syndicate

View File

@@ -6,30 +6,30 @@
/datum/uplink_item/item/stealthy_weapons/soap
name = "Subversive Soap"
item_cost = 1
item_cost = 5
path = /obj/item/weapon/soap/syndie
/datum/uplink_item/item/stealthy_weapons/concealed_cane
name = "Concealed Cane Sword"
item_cost = 1
item_cost = 10
path = /obj/item/weapon/cane/concealed
/datum/uplink_item/item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
item_cost = 3
item_cost = 30
path = /obj/item/weapon/cartridge/syndicate
/datum/uplink_item/item/stealthy_weapons/parapen
name = "Paralysis Pen"
item_cost = 3
item_cost = 40
path = /obj/item/weapon/pen/reagent/paralysis
/datum/uplink_item/item/stealthy_weapons/cigarette_kit
name = "Cigarette Kit"
item_cost = 3
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/cigarette
/datum/uplink_item/item/stealthy_weapons/random_toxin
name = "Random Toxin - Beaker"
item_cost = 3
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/toxin

View File

@@ -0,0 +1,39 @@
/***************
* Telecrystals *
***************/
/datum/uplink_item/item/telecrystal
category = /datum/uplink_category/telecrystals
blacklisted = 1
/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc)
return new /obj/item/stack/telecrystal(loc, cost(U.uses))
/datum/uplink_item/item/telecrystal/one
name = "Telecrystal - 01"
item_cost = 1
/datum/uplink_item/item/telecrystal/five
name = "Telecrystals - 05"
item_cost = 5
/datum/uplink_item/item/telecrystal/ten
name = "Telecrystals - 10"
item_cost = 10
/datum/uplink_item/item/telecrystal/twentyfive
name = "Telecrystals - 25"
item_cost = 25
/datum/uplink_item/item/telecrystal/fifty
name = "Telecrystals - 50"
item_cost = 50
/datum/uplink_item/item/telecrystal/onehundred
name = "Telecrystals - 100"
item_cost = 100
/datum/uplink_item/item/telecrystal/all
name = "Telecrystals - Empty Uplink"
/datum/uplink_item/item/telecrystal/all/cost(var/telecrystals)
return max(1, telecrystals)

View File

@@ -4,82 +4,82 @@
/datum/uplink_item/item/tools
category = /datum/uplink_category/tools
/datum/uplink_item/item/tools/binoculars
name = "Binoculars"
item_cost = 5
path = /obj/item/device/binoculars
/datum/uplink_item/item/tools/toolbox
name = "Fully Loaded Toolbox"
item_cost = 1
item_cost = 10
path = /obj/item/weapon/storage/toolbox/syndicate
/datum/uplink_item/item/tools/plastique
name = "C-4 (Destroys walls)"
item_cost = 2
item_cost = 20
path = /obj/item/weapon/plastique
/datum/uplink_item/item/tools/encryptionkey_radio
name = "Encrypted Radio Channel Key"
item_cost = 2
item_cost = 20
path = /obj/item/device/encryptionkey/syndicate
/datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool"
item_cost = 20
path = /obj/item/device/multitool/hacktool
desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
This device will also be able to immediately access the last 6 to 8 hacked airlocks."
/datum/uplink_item/item/tools/encryptionkey_binary
name = "Binary Translator Key"
item_cost = 3
item_cost = 20
path = /obj/item/device/encryptionkey/binary
/datum/uplink_item/item/tools/emag
name = "Cryptographic Sequencer"
item_cost = 3
item_cost = 30
path = /obj/item/weapon/card/emag
/datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit"
item_cost = 3
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/clerical
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 15
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/space_suit
name = "Space Suit"
item_cost = 3
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/space
/datum/uplink_item/item/tools/thermal
name = "Thermal Imaging Glasses"
item_cost = 3
item_cost = 30
path = /obj/item/clothing/glasses/thermal/syndi
/datum/uplink_item/item/tools/powersink
name = "Powersink (DANGER!)"
item_cost = 5
item_cost = 50
path = /obj/item/device/powersink
/datum/uplink_item/item/tools/ai_module
name = "Hacked AI Upload Module"
item_cost = 7
item_cost = 60
path = /obj/item/weapon/aiModule/syndicate
/datum/uplink_item/item/tools/supply_beacon
name = "Hacked Supply Beacon (DANGER!)"
item_cost = 7
item_cost = 60
path = /obj/item/supply_beacon
/datum/uplink_item/item/tools/teleporter
name = "Teleporter Circuit Board"
item_cost = 20
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
path = /obj/item/weapon/circuitboard/teleporter
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 3
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/crystal
name = "Tradable Crystal"
item_cost = 1
path = /obj/item/device/telecrystal
desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone."
/datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool"
item_cost = 2
path = /obj/item/device/multitool/hacktool
desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
This device will also be able to immediately access the last 6 to 8 hacked airlocks."
blacklisted = 1

View File

@@ -46,4 +46,7 @@ datum/uplink_category/ammunition
name = "Devices and Tools"
/datum/uplink_category/visible_weapons
name = "Highly Visible and Dangerous Weapons"
name = "Highly Visible and Dangerous Weapons"
/datum/uplink_category/telecrystals
name = "Telecrystals"

View File

@@ -31,6 +31,7 @@ var/datum/uplink/uplink = new()
var/item_cost = 0
var/datum/uplink_category/category // Item category
var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all.
var/blacklisted = 0
/datum/uplink_item/item
var/path = null
@@ -172,3 +173,15 @@ datum/uplink_item/dd_SortValue()
remaining_TC -= I.cost(remaining_TC, U)
return bought_items
/proc/get_surplus_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc)
var/list/bought_items = list()
var/override = 1
while(remaining_TC)
var/datum/uplink_item/I = all_uplink_selection.get_random_item(remaining_TC, U, bought_items, override)
if(!I)
break
bought_items += I
remaining_TC -= I.cost(remaining_TC, U)
return bought_items

View File

@@ -4,39 +4,49 @@
/datum/uplink_item/item/visible_weapons
category = /datum/uplink_category/visible_weapons
/datum/uplink_item/item/visible_weapons/tactknife
name = "Tactical Knife"
item_cost = 10
path = /obj/item/weapon/material/hatchet/tacknife
/datum/uplink_item/item/visible_weapons/combatknife
name = "Combat Knife"
item_cost = 30
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword
name = "Energy Sword"
item_cost = 4
item_cost = 40
path = /obj/item/weapon/melee/energy/sword
/datum/uplink_item/item/visible_weapons/dartgun
name = "Dart Gun"
item_cost = 5
item_cost = 30
path = /obj/item/weapon/gun/projectile/dartgun
/datum/uplink_item/item/visible_weapons/crossbow
name = "Energy Crossbow"
item_cost = 5
item_cost = 40
path = /obj/item/weapon/gun/energy/crossbow
/datum/uplink_item/item/visible_weapons/silenced_45
name = "Silenced .45"
item_cost = 5
item_cost = 40
path = /obj/item/weapon/gun/projectile/silenced
/datum/uplink_item/item/visible_weapons/riggedlaser
name = "Exosuit Rigged Laser"
item_cost = 6
item_cost = 60
path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
/datum/uplink_item/item/visible_weapons/revolver
name = "Revolver"
item_cost = 6
item_cost = 70
path = /obj/item/weapon/gun/projectile/revolver
/datum/uplink_item/item/visible_weapons/Derringer
name = ".357 Derringer Pistol"
item_cost = 5
item_cost = 40
path = /obj/item/weapon/gun/projectile/derringer
/datum/uplink_item/item/visible_weapons/heavysniper
@@ -46,61 +56,51 @@
/datum/uplink_item/item/visible_weapons/tommygun
name = "Tommygun (.45)" // We're keeping this because it's CLASSY. -Spades
item_cost = 7
item_cost = 60
path = /obj/item/weapon/gun/projectile/automatic/tommygun
//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
/datum/uplink_item/item/visible_weapons/submachinegun
name = "Submachine Gun (10mm)"
item_cost = 6
item_cost = 60
path = /obj/item/weapon/gun/projectile/automatic/c20r
/datum/uplink_item/item/visible_weapons/assaultrifle
name = "Assault Rifle (7.62mm)"
item_cost = 7
item_cost = 75
path = /obj/item/weapon/gun/projectile/automatic/sts35
/datum/uplink_item/item/visible_weapons/bullpuprifle
/*/datum/uplink_item/item/visible_weapons/bullpuprifle
name = "Assault Rifle (5.56mm)"
item_cost = 7
path = /obj/item/weapon/gun/projectile/automatic/carbine
*/
/datum/uplink_item/item/visible_weapons/combatshotgun
name = "Combat Shotgun"
item_cost = 7
item_cost = 75
path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
/datum/uplink_item/item/visible_weapons/egun
name = "Energy Gun"
item_cost = 5
item_cost = 60
path = /obj/item/weapon/gun/energy/gun
/datum/uplink_item/item/visible_weapons/lasercannon
name = "Laser Cannon"
item_cost = 6
item_cost = 60
path = /obj/item/weapon/gun/energy/lasercannon
/datum/uplink_item/item/visible_weapons/lasercarbine
name = "Laser Carbine"
item_cost = 7
item_cost = 75
path = /obj/item/weapon/gun/energy/laser
/datum/uplink_item/item/visible_weapons/ionrifle
name = "Ion Rifle"
item_cost = 5
item_cost = 40
path = /obj/item/weapon/gun/energy/ionrifle
/datum/uplink_item/item/visible_weapons/xray
name = "Xray Gun"
item_cost = 7
path = /obj/item/weapon/gun/energy/xray
/datum/uplink_item/item/visible_weapons/tactknife
name = "Tactical Knife"
item_cost = 1
path = /obj/item/weapon/material/hatchet/tacknife
/datum/uplink_item/item/visible_weapons/combatknife
name = "Combat Knife"
item_cost = 3
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
item_cost = 85
path = /obj/item/weapon/gun/energy/xray

View File

@@ -190,9 +190,8 @@ var/global/list/PDA_Manifest = list()
/obj/item/weapon/beach_ball
icon = 'icons/misc/beach.dmi'
icon_state = "ball"
icon_state = "beachball"
name = "beach ball"
item_state = "beachball"
density = 0
anchored = 0
w_class = 4

View File

@@ -79,7 +79,10 @@
desc = "A cane used by a true gentlemen. Or a clown."
icon = 'icons/obj/weapons.dmi'
icon_state = "cane"
item_state = "stick"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
flags = CONDUCT
force = 5.0
throwforce = 7.0
@@ -135,7 +138,6 @@
desc = "A cane used by the blind."
icon = 'icons/obj/weapons.dmi'
icon_state = "whitecane"
item_state = "whitecane"
/obj/item/weapon/disk
name = "disk"
@@ -245,6 +247,10 @@
desc = "Apparently a staff used by the wizard."
icon = 'icons/obj/wizard.dmi'
icon_state = "staff"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
force = 3.0
throwforce = 5.0
throw_speed = 1
@@ -263,14 +269,13 @@
desc = "An ebony can with an ivory tip."
icon = 'icons/obj/weapons.dmi'
icon_state = "cane"
item_state = "stick"
/obj/item/weapon/staff/stick
name = "stick"
desc = "A great tool to drag someone else's drinks across the bar."
icon = 'icons/obj/weapons.dmi'
icon_state = "stick"
item_state = "stick"
item_state = "cane"
force = 3.0
throwforce = 5.0
throw_speed = 1
@@ -380,7 +385,6 @@
name = "rapid part exchange device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
item_state = "RPED"
w_class = 5
can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50

View File

@@ -2,6 +2,9 @@
Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so
the HUD updates properly! */
// hud overlay image type, used for clearing client.images precisely
/image/hud_overlay
//Medical HUD outputs. Called by the Life() proc of the mob using it, usually.
proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt)
if(!can_process_hud(M))
@@ -63,9 +66,8 @@ proc/can_process_hud(var/mob/M)
//Deletes the current HUD images so they can be refreshed with new ones.
mob/proc/handle_regular_hud_updates() //Used in the life.dm of mobs that can use HUDs.
if(client)
for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud")
client.images -= hud
for(var/image/hud_overlay/hud in client.images)
client.images -= hud
med_hud_users -= src
sec_hud_users -= src

View File

@@ -99,19 +99,26 @@
// Prune restricted status. Broke it up for readability.
// Note that this is done before jobs are handed out.
for(var/datum/mind/player in ticker.mode.get_players_for_role(role_type, id))
candidates = ticker.mode.get_players_for_role(role_type, id, ghosts_only)
for(var/datum/mind/player in candidates)
if(ghosts_only && !istype(player.current, /mob/observer/dead))
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role!")
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft.")
else if(istype(player.current, /mob/living/voice))
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are only a communicator voice. They have been removed from the draft.")
else if(player.special_role)
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])!")
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.")
else if (player in pending_antagonists)
log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role!")
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role! They have been removed from the draft.")
else if(!can_become_antag(player))
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role!")
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role! They have been removed from the draft.")
else if(player_is_antag(player))
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist!")
else
candidates += player
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist! They have been removed from the draft.")
return candidates

View File

@@ -0,0 +1,79 @@
var/datum/antagonist/technomancer/technomancers
/datum/antagonist/technomancer
id = MODE_TECHNOMANCER
role_type = BE_WIZARD
role_text = "Technomancer"
role_text_plural = "Technomancers"
bantype = "wizard"
landmark_id = "wizard"
welcome_text = "You will need to purchase <b>functions</b> and perhaps some <b>equipment</b> from the various machines around your \
base. Choose your technological arsenal carefully. Remember that without the <b>core</b> on your back, your functions are \
powerless, and therefore you will be as well.<br>\
In your pockets you will find a one-time use teleport device. Use it to leave the base and go to the colony, when you are ready."
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_VOTABLE
antaghud_indicator = "hudwizard"
hard_cap = 1
hard_cap_round = 3
initial_spawn_req = 1
initial_spawn_target = 1
id_type = /obj/item/weapon/card/id/syndicate
/datum/antagonist/technomancer/New()
..()
technomancers = src
/datum/antagonist/technomancer/update_antag_mob(var/datum/mind/technomancer)
..()
technomancer.store_memory("<B>Remember:</B> Do not forget to purchase the functions and equipment you need.")
technomancer.current.real_name = "[pick(wizard_first)] [pick(wizard_second)]"
technomancer.current.name = technomancer.current.real_name
/datum/antagonist/technomancer/equip(var/mob/living/carbon/human/technomancer_mob)
if(!..())
return 0
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/under/technomancer/master(technomancer_mob), slot_w_uniform)
create_id("Technomagus", technomancer_mob)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/disposable_teleporter/free(technomancer_mob), slot_r_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_catalog(technomancer_mob), slot_l_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_core(technomancer_mob), slot_back)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/master(technomancer_mob), slot_head)
technomancer_mob.update_icons()
return 1
/datum/antagonist/technomancer/proc/equip_apprentice(var/mob/living/carbon/human/technomancer_mob)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/under/technomancer/apprentice(technomancer_mob), slot_w_uniform)
create_id("Techno-apprentice", technomancer_mob)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/disposable_teleporter/free(technomancer_mob), slot_r_store)
var/obj/item/weapon/technomancer_catalog/apprentice/catalog = new /obj/item/weapon/technomancer_catalog/apprentice()
catalog.bind_to_owner(technomancer_mob)
technomancer_mob.equip_to_slot_or_del(catalog, slot_l_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_core(technomancer_mob), slot_back)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/apprentice(technomancer_mob), slot_head)
technomancer_mob.update_icons()
return 1
/datum/antagonist/technomancer/check_victory()
var/survivor
for(var/datum/mind/player in current_antagonists)
if(!player.current || player.current.stat == DEAD)
continue
survivor = 1
break
if(!survivor)
feedback_set_details("round_end_result","loss - technomancer killed")
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been \
killed!</font></span>"

View File

@@ -0,0 +1,65 @@
var/datum/antagonist/trader/traders
/datum/antagonist/trader
id = MODE_TRADE
role_type = BE_OPERATIVE
role_text = "Trader"
role_text_plural = "Traders"
welcome_text = "As a crewmember of the Beruang, you answer to your captain and international laws of space."
antag_text = "You are an <b>non-antagonist</b> visitor! Within the rules, \
try to provide interesting interaction for the crew. \
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \
and before taking extreme actions, please try to also contact the administration! \
Think through your actions and make the roleplay immersive! <b>Please remember all \
rules apply to you.</b>"
leader_welcome_text = "As Captain of the Beruang, you have control over your crew and cargo. It may be worth briefly discussing a consistent shared backstory with your crew."
landmark_id = "Trader"
id_type = /obj/item/weapon/card/id/external
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME
hard_cap = 5
hard_cap_round = 7
initial_spawn_req = 5
initial_spawn_target = 7
/datum/antagonist/trader/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
if(istype(M)) M.age = rand(25,45)
/datum/antagonist/trader/New()
..()
traders = src
/datum/antagonist/trader/greet(var/datum/mind/player)
if(!..())
return
player.current << "The Beruang is an independent cargo hauler, unless you decide otherwise. You're on your way to [station_name()]."
player.current << "You may want to discuss a collective story with the rest of your crew. More members may be joining, so don't move out straight away!"
/datum/antagonist/trader/equip(var/mob/living/carbon/human/player)
player.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(src), slot_w_uniform)
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(src), slot_shoes)
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/brown(src), slot_gloves)
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
create_radio(PUB_FREQ, player) //Assume they tune their headsets into the station's public radio as they approach
var/obj/item/weapon/card/id/id = create_id("Trader", player, equip = 0)
id.name = "[player.real_name]'s Passport"
id.assignment = "Trader"
id.access |= access_trader
var/obj/item/weapon/storage/wallet/W = new(player)
W.handle_item_insertion(id)
player.equip_to_slot_or_del(W, slot_wear_id)
spawn_money(rand(50,150)*10,W)
return 1
/datum/antagonist/trader/update_access(var/mob/living/player)
for(var/obj/item/weapon/storage/wallet/W in player.contents)
for(var/obj/item/weapon/card/id/id in W.contents)
id.name = "[player.real_name]'s Passport"
id.registered_name = player.real_name
W.name = "[initial(W.name)] ([id.name])"

View File

@@ -351,6 +351,14 @@ area/space/atmosalert()
name = "\improper Administration Shuttle"
icon_state = "shuttlered2"
/area/shuttle/trade/centcom
name = "\improper Trade Shuttle Centcom"
icon_state = "shuttlered"
/area/shuttle/trade/station
name = "\improper Trade Shuttle"
icon_state = "shuttlered"
/area/shuttle/thunderdome
name = "honk"
@@ -838,7 +846,7 @@ area/space/atmosalert()
/area/maintenance/engineering
name = "Engineering Maintenance"
icon_state = "maint_engineering"
/area/maintenance/engineering/pumpstation
name = "Engineering Pump Station"
icon_state = "maint_pumpstation"
@@ -2763,10 +2771,10 @@ var/list/the_station_areas = list (
/area/construction,
/area/ai_monitored/storage/eva,
/area/ai_monitored/storage/secure,
/area/ai_monitored/storage/emergency,
/area/ai_monitored/storage/emergency,
/area/ai_upload,
/area/ai_upload_foyer,
/area/ai
/area/ai
)

View File

@@ -230,6 +230,11 @@ its easier to just keep the beam vertical.
/atom/proc/melt()
return
// Previously this was defined both on /obj/ and /turf/ seperately. And that's bad.
/atom/proc/update_icon()
return
/atom/proc/hitby(atom/movable/AM as mob|obj)
if (density)
AM.throwing = 0

View File

@@ -79,6 +79,16 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(lesser_form && !P.allowduringlesserform) continue
if(!(P in src.verbs))
src.verbs += P.verbpath
if(P.make_hud_button)
if(!src.ability_master)
src.ability_master = new /obj/screen/movable/ability_master(src)
src.ability_master.add_ling_ability(
object_given = src,
verb_given = P.verbpath,
name_given = P.name,
ability_icon_given = P.ability_icon_state,
arguments = list()
)
for(var/language in languages)
mind.changeling.absorbed_languages |= language
@@ -96,6 +106,9 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
if(P.isVerb)
verbs -= P.verbpath
var/obj/screen/ability/verb_based/changeling/C = ability_master.get_ability_by_proc_ref(P.verbpath)
if(C)
ability_master.remove_ability(C)
//Helper proc. Does all the checks and stuff for us to avoid copypasta

View File

@@ -12,6 +12,8 @@ var/list/datum/power/changeling/powerinstances = list()
var/enhancedtext = ""
var/isVerb = 1 // Is it an active power, or passive?
var/verbpath // Path to a verb that contains the effects.
var/make_hud_button = 1 // Is this ability significant enough to dedicate screen space for a HUD button?
var/ability_icon_state = null // icon_state for icons for the ability HUD. Must be in screen_spells.dmi.
/datum/power/changeling
var/allowduringlesserform = 0
@@ -340,6 +342,17 @@ var/list/datum/power/changeling/powerinstances = list()
if(Thepower.genomecost > 0)
purchased_powers_history.Add("[Pname] ([Thepower.genomecost] points)")
if(Thepower.make_hud_button && Thepower.isVerb)
if(!M.current.ability_master)
M.current.ability_master = new /obj/screen/movable/ability_master(M.current)
M.current.ability_master.add_ling_ability(
object_given = M.current,
verb_given = Thepower.verbpath,
name_given = Thepower.name,
ability_icon_given = Thepower.ability_icon_state,
arguments = list()
)
if(!Thepower.isVerb && Thepower.verbpath)
call(M.current, Thepower.verbpath)()
else if(remake_verbs)

View File

@@ -1,6 +1,7 @@
/datum/power/changeling/absorb_dna
name = "Absorb DNA"
desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger if they were of our kind."
ability_icon_state = "ling_absorb_dna"
genomecost = 0
verbpath = /mob/proc/changeling_absorb_dna

View File

@@ -3,6 +3,7 @@
desc = "We reform one of our arms into a deadly blade."
helptext = "We may retract our armblade by dropping it. It can deflect projectiles."
enhancedtext = "The blade will have armor peneratration."
ability_icon_state = "ling_armblade"
genomecost = 2
verbpath = /mob/proc/changeling_arm_blade
@@ -27,11 +28,11 @@
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
w_class = 5.0
force = 40
sharp = 1
edge = 1
pry = 1
anchored = 1
throwforce = 0 //Just to be on the safe side
throw_range = 0

View File

@@ -2,13 +2,13 @@
name = "Organic Space Suit"
desc = "We grow an organic suit to protect ourselves from space exposure."
helptext = "To remove the suit, use the ability again."
ability_icon_state = "ling_space_suit"
genomecost = 1
verbpath = /mob/proc/changeling_spacesuit
/mob/proc/changeling_spacesuit()
set category = "Changeling"
set name = "Organic Space Suit (20)"
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling))
return 1
return 0
@@ -17,6 +17,7 @@
name = "Chitinous Spacearmor"
desc = "We turn our skin into tough chitin to protect us from damage and space exposure."
helptext = "To remove the armor, use the ability again."
ability_icon_state = "ling_armor"
genomecost = 3
verbpath = /mob/proc/changeling_spacearmor
@@ -70,7 +71,6 @@
name = "chitinous mass"
desc = "A tough, hard covering of black chitin."
icon_state = "lingarmor"
item_state = "lingarmor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
armor = list(melee = 75, bullet = 60, laser = 60, energy = 60, bomb = 60, bio = 0, rad = 0) //It costs 3 points, so it should be very protective.
siemens_coefficient = 0.3
@@ -91,7 +91,6 @@
name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
item_state = "lingarmorhelmet"
armor = list(melee = 75, bullet = 60, laser = 60,energy = 60, bomb = 60, bio = 0, rad = 0)
siemens_coefficient = 0.3
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE

View File

@@ -4,6 +4,7 @@
name = "Augmented Eyesight"
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability."
helptext = "Grants us night vision and thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
ability_icon_state = "ling_augmented_eyesight"
genomecost = 2
var/active = 0 //Whether or not vision is enhanced
verbpath = /mob/proc/changeling_augmented_eyesight

View File

@@ -5,6 +5,7 @@
helptext = "We can shock someone by grabbing them and using this ability, or using the ability with an empty hand and touching them. \
Shocking someone costs ten chemicals per use."
enhancedtext = "Shocking biologicals without grabbing only requires five chemicals, and has more disabling power."
ability_icon_state = "ling_bioelectrogenesis"
genomecost = 2
verbpath = /mob/living/carbon/human/proc/changeling_bioelectrogenesis

View File

@@ -2,6 +2,7 @@
name = "Blind Sting"
desc = "We silently sting a human, completely blinding them for a short time."
enhancedtext = "Duration is extended."
ability_icon_state = " ling_sting_blind"
genomecost = 2
allowduringlesserform = 1
verbpath = /mob/proc/changeling_blind_sting

View File

@@ -3,6 +3,7 @@
desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
helptext = "Allows us to prepare the next sting to have a range of two tiles."
enhancedtext = "The range is extended to five tiles."
ability_icon_state = "ling_sting_boost_range"
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_boost_range

View File

@@ -4,6 +4,7 @@
helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing. Has \
a three minute cooldown between uses."
enhancedtext = "Increases the amount of chemicals injected."
ability_icon_state = "ling_sting_cryo"
genomecost = 1
verbpath = /mob/proc/changeling_cryo_sting

View File

@@ -2,6 +2,7 @@
name = "Deaf Sting"
desc = "We silently sting a human, completely deafening them for a short time."
enhancedtext = "Deafness duration is extended."
ability_icon_state = "ling_sting_deafen"
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_deaf_sting

View File

@@ -1,6 +1,7 @@
/datum/power/changeling/DeathSting
name = "Death Sting"
desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured."
ability_icon_state = "ling_sting_death"
genomecost = 10
verbpath = /mob/proc/changeling_DEATHsting

View File

@@ -4,6 +4,7 @@
implicate ourselves."
helptext = "The toxin takes effect in about two minutes. The sting has a three minute cooldown between uses."
enhancedtext = "The toxic damage is doubled."
ability_icon_state = "ling_sting_del_toxin"
genomecost = 1
verbpath = /mob/proc/changeling_delayed_toxic_sting

View File

@@ -2,6 +2,7 @@
name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
ability_icon_state = "ling_digital_camo"
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo

View File

@@ -3,6 +3,7 @@
desc = "We discreetly evolve a finger to be able to send a small electric charge. \
We can open most electrical locks, but it will be obvious when we do so."
helptext = "Use the ability, then touch something that utilizes an electrical locking system, to open it. Each use costs 10 chemicals."
ability_icon_state = "ling_electric_lockpick"
genomecost = 3
verbpath = /mob/proc/changeling_electric_lockpick

View File

@@ -4,6 +4,7 @@
helptext = "Lowers the maximum health of the victim for a few minutes. This sting will also warn them of this. Has a \
five minute coodown between uses."
enhancedtext = "Maximum health is lowered further."
ability_icon_state = "ling_sting_enfeeble"
genomecost = 1
verbpath = /mob/proc/changeling_enfeebling_string

View File

@@ -3,6 +3,7 @@
desc = "We evolve additional sacs of adrenaline throughout our body."
helptext = "We can instantly recover from stuns and reduce the effect of future stuns, but we will suffer toxicity in the long term. Can be used while unconscious."
enhancedtext = "Constant recovery from stuns for thirty seconds."
ability_icon_state = "ling_epinepherine_overdose"
genomecost = 2
verbpath = /mob/proc/changeling_epinephrine_overdose

View File

@@ -2,6 +2,7 @@
name = "Extract DNA"
desc = "We stealthily sting a target and extract the DNA from them."
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
ability_icon_state = "ling_sting_extract"
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting

View File

@@ -17,6 +17,7 @@ var/global/list/changeling_fabricated_clothing = list(
We cannot be relieved of this clothing by others."
helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \
To remove our new fabricated clothing, use this ability again."
ability_icon_state = "ling_fabricate_clothing"
genomecost = 2
verbpath = /mob/proc/changeling_fabricate_clothing
@@ -32,6 +33,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/under/chameleon/changeling
name = "malformed flesh"
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi',
)
item_state = "lingchameleon"
worn_state = "lingchameleon"
desc = "The flesh all around us has grown a new layer of cells that can shift appearance and create a biological fabric that cannot be distinguished from \
@@ -78,6 +83,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/suit/chameleon/changeling
name = "chitinous chest"
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi',
)
item_state = "armor"
desc = "The cells in our chest are rapidly shifting, ready to reform into material that can resemble most pieces of clothing."
origin_tech = list()
@@ -100,6 +109,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/shoes/chameleon/changeling
name = "malformed feet"
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi',
)
item_state = "black"
desc = "Our feet are overlayed with another layer of flesh and bone on top. We can reform our feet to resemble various boots and shoes."
origin_tech = list()
@@ -122,6 +135,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/weapon/storage/backpack/chameleon/changeling
name = "backpack"
icon_state = "backpack"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
item_state = "backpack"
desc = "A large pouch imbedded in our back, it can shift form to resemble many common backpacks that other biologicals are fond of using."
origin_tech = list()
@@ -146,6 +163,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/gloves/chameleon/changeling
name = "malformed hands"
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
item_state = "lingchameleon"
desc = "Our hands have a second layer of flesh on top. We can reform our hands to resemble a large variety of fabrics and materials that biologicals \
tend to wear on their hands. Remember that these won't protect your hands from harm."
@@ -170,6 +191,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/mask/chameleon/changeling
name = "chitin visor"
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi',
)
item_state = "gas_alt"
desc = "A transparent visor of brittle chitin covers our face. We can reform it to resemble various masks that biologicals use. It can also utilize internal \
tanks.."
@@ -216,6 +241,10 @@ var/global/list/changeling_fabricated_clothing = list(
name = "waist pouch"
desc = "We can store objects in this, as well as shift it's appearance, so that it resembles various common belts."
icon_state = "lingchameleon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
item_state = "utility"
origin_tech = list()
canremove = 0

View File

@@ -2,6 +2,7 @@
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
helptext = "Can be used before or after death. Duration varies greatly."
ability_icon_state = "ling_regenerative_stasis"
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/proc/changeling_fakedeath

View File

@@ -3,6 +3,7 @@
desc = "Begins a slow rengeration of our form. Does not effect stuns or chemicals."
helptext = "Can be used while unconscious."
enhancedtext = "Healing is twice as effective."
ability_icon_state = "ling_fleshmend"
genomecost = 1
verbpath = /mob/proc/changeling_fleshmend

View File

@@ -5,6 +5,7 @@
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
genomecost = 0
make_hud_button = 0
verbpath = /mob/proc/changeling_hiveupload
/datum/power/changeling/hive_download
@@ -12,6 +13,7 @@
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
genomecost = 0
make_hud_button = 0
verbpath = /mob/proc/changeling_hivedownload
// HIVE MIND UPLOAD/DOWNLOAD DNA

View File

@@ -2,6 +2,7 @@
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
ability_icon_state = "ling_mimic_voice"
genomecost = 1
verbpath = /mob/proc/changeling_mimicvoice

View File

@@ -3,6 +3,7 @@
desc = "Expels impurifications from our form; curing diseases, removing toxins, chemicals, radiation, and resetting our genetic code completely."
helptext = "Can be used while unconscious. This will also purge any reagents inside ourselves, both harmful and beneficial."
enhancedtext = "We heal more toxins."
ability_icon_state = "ling_anatomic_panacea"
genomecost = 1
verbpath = /mob/proc/changeling_panacea
@@ -25,6 +26,7 @@
C.sdisabilities = 0
C.disabilities = 0
C.reagents.clear_reagents()
C.ingested.clear_reagents()
var/heal_amount = 5
if(src.mind.changeling.recursive_enhancement)

View File

@@ -4,6 +4,7 @@
helptext = "This will heal a significant amount of brute, fire, oxy, clone, and brain damage, and heal broken bones, internal bleeding, low blood, \
and organ damage. The process is fast, but anyone who sees us do this will likely realize we are not what we seem."
enhancedtext = "Healing increased to heal up to maximum health."
ability_icon_state = "ling_rapid_regeneration"
genomecost = 2
verbpath = /mob/proc/changeling_rapid_regen

View File

@@ -2,6 +2,7 @@
name = "Recursive Enhancement"
desc = "We cause our next ability use to have increased or additional effects."
helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
ability_icon_state = "ling_recursive_enhancement"
genomecost = 3
verbpath = /mob/proc/changeling_recursive_enhancement

View File

@@ -45,6 +45,7 @@
C.mind.changeling.purchased_powers -= C
feedback_add_details("changeling_powers","CR")
C.stat = CONSCIOUS
C.timeofdeath = null
src.verbs -= /mob/proc/changeling_revive
// re-add our changeling powers
C.make_changeling()

View File

@@ -3,6 +3,7 @@
desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded biologicals and synthetics."
helptext = "Lights are blown, organics are disoriented, and synthetics act as if they were flashed."
enhancedtext = "Range is doubled."
ability_icon_state = "ling_resonant_shriek"
genomecost = 2
verbpath = /mob/proc/changeling_resonant_shriek
@@ -11,6 +12,7 @@
desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
helptext = "Creates a moderate sized EMP."
enhancedtext = "Range is doubled."
ability_icon_state = "ling_dissonant_shriek"
genomecost = 2
verbpath = /mob/proc/changeling_dissonant_shriek

View File

@@ -3,6 +3,7 @@
desc = "We silently sting a human, completely silencing them for a short time."
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
enhancedtext = "Silence duration is extended."
ability_icon_state = "ling_sting_mute"
genomecost = 2
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting

View File

@@ -1,6 +1,7 @@
/datum/power/changeling/transform
name = "Transform"
desc = "We take on the apperance and voice of one we have absorbed."
ability_icon_state = "ling_transform"
genomecost = 0
verbpath = /mob/proc/changeling_transform

View File

@@ -3,6 +3,7 @@
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
ability_icon_state = "ling_sting_transform"
genomecost = 3
verbpath = /mob/proc/changeling_transformation_sting

View File

@@ -4,6 +4,7 @@
We are undetectable, so long as we move slowly.(Toggle)"
helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
enhancedtext = "True invisiblity while cloaked."
ability_icon_state = "ling_camoflage"
genomecost = 3
verbpath = /mob/proc/changeling_visible_camouflage

View File

@@ -2,7 +2,6 @@
name = "cult blade"
desc = "An arcane weapon wielded by the followers of Nar-Sie."
icon_state = "cultblade"
item_state = "cultblade"
w_class = 4
force = 30
throwforce = 10
@@ -72,7 +71,6 @@
name = "cult robes"
desc = "A set of armored robes worn by the followers of Nar-Sie."
icon_state = "cultrobes"
item_state = "cultrobes"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
@@ -84,13 +82,12 @@
/obj/item/clothing/suit/cultrobes/alt
icon_state = "cultrobesalt"
item_state = "cultrobesalt"
item_state = "cultrobes"
/obj/item/clothing/suit/cultrobes/magusred
name = "magus robes"
desc = "A set of armored robes worn by the followers of Nar-Sie."
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -107,7 +104,6 @@
/obj/item/clothing/suit/space/cult
name = "cult armour"
icon_state = "cult_armour"
item_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space-worthy."
w_class = 3
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit)

View File

@@ -50,7 +50,7 @@
src.invisibility = INVISIBILITY_MAXIMUM
density = 0
/obj/machinery/cooking/cultify()
/obj/machinery/cooker/cultify()
new /obj/structure/cult/talisman(loc)
qdel(src)

View File

@@ -372,7 +372,7 @@ var/global/list/additional_antag_types = list()
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
return 0
/datum/game_mode/proc/get_players_for_role(var/role, var/antag_id)
/datum/game_mode/proc/get_players_for_role(var/role, var/antag_id, var/ghosts_only)
var/list/players = list()
var/list/candidates = list()
@@ -387,6 +387,8 @@ var/global/list/additional_antag_types = list()
continue
if(istype(player, /mob/new_player))
continue
if(istype(player, /mob/observer/dead) && !ghosts_only)
continue
if(!role || (player.client.prefs.be_special & role))
log_debug("[player.key] had [antag_id] enabled, so we are drafting them.")
candidates |= player.mind

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