mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 02:34:00 +00:00
Polaris sync
This commit is contained in:
@@ -5,7 +5,7 @@ sudo: false
|
||||
env:
|
||||
BYOND_MAJOR="510"
|
||||
BYOND_MINOR="1346"
|
||||
MACRO_COUNT=987
|
||||
MACRO_COUNT=986
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 //////
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
378
code/_onclick/hud/ability_screen_objects.dm
Normal file
378
code/_onclick/hud/ability_screen_objects.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -120,7 +120,7 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f
|
||||
if(choices[current_votes[key]] == .)
|
||||
round_voters += key // Keep track of who voted for the winning round.
|
||||
if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes
|
||||
text += "<b>Vote Result: [.]</b>"
|
||||
text += "<b>Vote Result: [mode == VOTE_GAMEMODE ? gamemode_names[.] : .]</b>"
|
||||
else
|
||||
text += "<b>The vote has ended.</b>"
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
389
code/datums/autolathe/arms.dm
Normal file
389
code/datums/autolathe/arms.dm
Normal 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
|
||||
71
code/datums/autolathe/autolathe.dm
Normal file
71
code/datums/autolathe/autolathe.dm
Normal 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
|
||||
32
code/datums/autolathe/devices.dm
Normal file
32
code/datums/autolathe/devices.dm
Normal 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
|
||||
95
code/datums/autolathe/engineering.dm
Normal file
95
code/datums/autolathe/engineering.dm
Normal 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
|
||||
124
code/datums/autolathe/general.dm
Normal file
124
code/datums/autolathe/general.dm
Normal 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
|
||||
39
code/datums/autolathe/medical.dm
Normal file
39
code/datums/autolathe/medical.dm
Normal 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
|
||||
39
code/datums/autolathe/tools.dm
Normal file
39
code/datums/autolathe/tools.dm
Normal 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
|
||||
30
code/datums/hierarchy.dm
Normal file
30
code/datums/hierarchy.dm
Normal 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
|
||||
@@ -81,3 +81,28 @@
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containername = "Disposal Dispenser Crate"
|
||||
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"
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
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"
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -70,28 +70,3 @@
|
||||
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 = 35
|
||||
containertype = /obj/structure/closet/crate/internals
|
||||
containername = "Emergency crate"
|
||||
@@ -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,
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
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
|
||||
|
||||
@@ -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,
|
||||
@@ -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,
|
||||
@@ -309,7 +309,6 @@
|
||||
/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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -24,11 +25,12 @@
|
||||
/datum/uplink_item/item/ammo/tommydrum
|
||||
name = "Tommygun Drum Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/tommydrum
|
||||
item_cost = 4 // Buy 40 bullets, get 10 free!
|
||||
item_cost = 40 // Buy 40 bullets, get 10 free!
|
||||
|
||||
/datum/uplink_item/item/ammo/darts
|
||||
name = "Darts"
|
||||
path = /obj/item/ammo_magazine/chemdart
|
||||
item_cost = 5
|
||||
|
||||
/datum/uplink_item/item/ammo/sniperammo
|
||||
name = "Anti-Materiel Rifle ammo box (14.5mm)"
|
||||
@@ -41,7 +43,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 +53,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 +65,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 +90,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)"
|
||||
@@ -97,7 +99,9 @@
|
||||
/datum/uplink_item/item/ammo/g12/stun
|
||||
name = "12g Auto-Shotgun Magazine (Stun)"
|
||||
path = /obj/item/weapon/storage/box/stunshells
|
||||
item_cost = 10 // Discount due to it being LTL.
|
||||
|
||||
/datum/uplink_item/item/ammo/g12/flash
|
||||
name = "12g Auto-Shotgun Magazine (Flash)"
|
||||
path = /obj/item/weapon/storage/box/flashshells
|
||||
item_cost = 10 // Discount due to it being LTL.
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = 540
|
||||
|
||||
/datum/uplink_item/item/badassery/surplus/merc4
|
||||
name = "Surplus Crate - 480 TC"
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4
|
||||
item_worth = 1200
|
||||
|
||||
/datum/uplink_item/item/badassery/surplus/merc6
|
||||
name = "Surplus Crate - 720 TC"
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 6
|
||||
item_worth = 1980
|
||||
|
||||
/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)
|
||||
|
||||
@@ -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
|
||||
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
|
||||
@@ -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
|
||||
item_cost = 80
|
||||
path = /obj/item/rig_module/mounted
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = 15
|
||||
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 = 15
|
||||
path = /obj/item/weapon/disk/file/cameras/syndicate
|
||||
|
||||
@@ -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 = 10
|
||||
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 = 10
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/toxin
|
||||
|
||||
39
code/datums/uplink/telecrystals.dm
Normal file
39
code/datums/uplink/telecrystals.dm
Normal 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)
|
||||
@@ -4,82 +4,112 @@
|
||||
/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
|
||||
path = /obj/item/weapon/plastique
|
||||
|
||||
/datum/uplink_item/item/tools/encryptionkey_radio
|
||||
name = "Encrypted Radio Channel Key"
|
||||
item_cost = 2
|
||||
path = /obj/item/device/encryptionkey/syndicate
|
||||
|
||||
/datum/uplink_item/item/tools/encryptionkey_binary
|
||||
name = "Binary Translator Key"
|
||||
item_cost = 3
|
||||
path = /obj/item/device/encryptionkey/binary
|
||||
|
||||
/datum/uplink_item/item/tools/emag
|
||||
name = "Cryptographic Sequencer"
|
||||
item_cost = 3
|
||||
path = /obj/item/weapon/card/emag
|
||||
|
||||
/datum/uplink_item/item/tools/clerical
|
||||
name = "Morphic Clerical Kit"
|
||||
item_cost = 3
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/clerical
|
||||
|
||||
/datum/uplink_item/item/tools/space_suit
|
||||
name = "Space Suit"
|
||||
item_cost = 3
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/space
|
||||
|
||||
/datum/uplink_item/item/tools/thermal
|
||||
name = "Thermal Imaging Glasses"
|
||||
item_cost = 3
|
||||
path = /obj/item/clothing/glasses/thermal/syndi
|
||||
|
||||
/datum/uplink_item/item/tools/powersink
|
||||
name = "Powersink (DANGER!)"
|
||||
item_cost = 5
|
||||
path = /obj/item/device/powersink
|
||||
|
||||
/datum/uplink_item/item/tools/ai_module
|
||||
name = "Hacked AI Upload Module"
|
||||
item_cost = 7
|
||||
path = /obj/item/weapon/aiModule/syndicate
|
||||
|
||||
/datum/uplink_item/item/tools/supply_beacon
|
||||
name = "Hacked Supply Beacon (DANGER!)"
|
||||
item_cost = 7
|
||||
path = /obj/item/supply_beacon
|
||||
|
||||
/datum/uplink_item/item/tools/teleporter
|
||||
name = "Teleporter Circuit Board"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/circuitboard/teleporter
|
||||
/datum/uplink_item/item/tools/encryptionkey_radio
|
||||
name = "Encrypted Radio Channel Key"
|
||||
item_cost = 10
|
||||
path = /obj/item/device/encryptionkey/syndicate
|
||||
|
||||
/datum/uplink_item/item/tools/money
|
||||
name = "Operations Funding"
|
||||
item_cost = 3
|
||||
item_cost = 10
|
||||
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/plastique
|
||||
name = "C-4 (Destroys walls)"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/plastique
|
||||
|
||||
/datum/uplink_item/item/tools/duffle
|
||||
name = "Black Duffle Bag"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/storage/backpack/dufflebag/syndie
|
||||
|
||||
/datum/uplink_item/item/tools/duffle/med
|
||||
name = "Black Medical Duffle Bag"
|
||||
path = /obj/item/weapon/storage/backpack/dufflebag/syndie/med
|
||||
|
||||
/datum/uplink_item/item/tools/duffle/ammo
|
||||
name = "Black Ammunition Duffle Bag"
|
||||
path = /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo
|
||||
|
||||
/datum/uplink_item/item/tools/space_suit
|
||||
name = "Space Suit"
|
||||
item_cost = 15
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/space
|
||||
|
||||
/datum/uplink_item/item/tools/encryptionkey_binary
|
||||
name = "Binary Translator Key"
|
||||
item_cost = 15
|
||||
path = /obj/item/device/encryptionkey/binary
|
||||
|
||||
/datum/uplink_item/item/tools/packagebomb
|
||||
name = "Package Bomb (Small)"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/demolitions
|
||||
|
||||
/datum/uplink_item/item/tools/hacking_tool
|
||||
name = "Door Hacking Tool"
|
||||
item_cost = 2
|
||||
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/emag
|
||||
name = "Cryptographic Sequencer"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/card/emag
|
||||
|
||||
/datum/uplink_item/item/tools/thermal
|
||||
name = "Thermal Imaging Glasses"
|
||||
item_cost = 30
|
||||
path = /obj/item/clothing/glasses/thermal/syndi
|
||||
|
||||
/datum/uplink_item/item/tools/powersink
|
||||
name = "Powersink (DANGER!)"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/powersink
|
||||
|
||||
/datum/uplink_item/item/tools/packagebomb/large
|
||||
name = "Package Bomb (Large)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_heavy
|
||||
|
||||
/*
|
||||
/datum/uplink_item/item/tools/packagebomb/huge
|
||||
name = "Package Bomb (Huge)
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy
|
||||
*/
|
||||
|
||||
/datum/uplink_item/item/tools/ai_module
|
||||
name = "Hacked AI Upload Module"
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/aiModule/syndicate
|
||||
|
||||
/datum/uplink_item/item/tools/supply_beacon
|
||||
name = "Hacked Supply Beacon (DANGER!)"
|
||||
item_cost = 60
|
||||
path = /obj/item/supply_beacon
|
||||
|
||||
/datum/uplink_item/item/tools/teleporter
|
||||
name = "Teleporter Circuit Board"
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
|
||||
path = /obj/item/weapon/circuitboard/teleporter
|
||||
blacklisted = 1
|
||||
@@ -47,3 +47,6 @@ datum/uplink_category/ammunition
|
||||
|
||||
/datum/uplink_category/visible_weapons
|
||||
name = "Highly Visible and Dangerous Weapons"
|
||||
|
||||
/datum/uplink_category/telecrystals
|
||||
name = "Telecrystals"
|
||||
@@ -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
|
||||
|
||||
@@ -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 = 20
|
||||
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
|
||||
item_cost = 85
|
||||
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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,8 +66,7 @@ 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")
|
||||
for(var/image/hud_overlay/hud in client.images)
|
||||
client.images -= hud
|
||||
med_hud_users -= src
|
||||
sec_hud_users -= src
|
||||
|
||||
@@ -104,6 +104,9 @@
|
||||
if(ghosts_only && !istype(player.current, /mob/observer/dead))
|
||||
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)
|
||||
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.")
|
||||
|
||||
83
code/game/antagonist/outsider/technomancer.dm
Normal file
83
code/game/antagonist/outsider/technomancer.dm
Normal file
@@ -0,0 +1,83 @@
|
||||
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)
|
||||
var/obj/item/weapon/technomancer_core/core = new /obj/item/weapon/technomancer_core(technomancer_mob)
|
||||
technomancer_mob.equip_to_slot_or_del(core, slot_back)
|
||||
technomancer_belongings.Add(core) // So it can be Tracked.
|
||||
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)
|
||||
var/obj/item/weapon/technomancer_core/core = new /obj/item/weapon/technomancer_core(technomancer_mob)
|
||||
technomancer_mob.equip_to_slot_or_del(core, slot_back)
|
||||
technomancer_belongings.Add(core) // So it can be Tracked.
|
||||
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>"
|
||||
65
code/game/antagonist/outsider/trader.dm
Normal file
65
code/game/antagonist/outsider/trader.dm
Normal 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])"
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "lingspacesuit"
|
||||
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 = "lingarmor"
|
||||
genomecost = 3
|
||||
verbpath = /mob/proc/changeling_spacearmor
|
||||
|
||||
@@ -33,7 +34,6 @@
|
||||
/obj/item/clothing/suit/space/changeling
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacesuit"
|
||||
item_state = "lingspacehelmet"
|
||||
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||
flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it,
|
||||
//it still ends up in your blood. (also balance but muh fluff)
|
||||
@@ -54,7 +54,6 @@
|
||||
/obj/item/clothing/head/helmet/space/changeling
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacehelmet"
|
||||
item_state = "lingspacehelmet"
|
||||
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||
flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL.
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -70,7 +69,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 +89,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -2,15 +2,30 @@
|
||||
name = "Self Respiration"
|
||||
desc = "We evolve our body to no longer require drawing oxygen from the atmosphere."
|
||||
helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones."
|
||||
ability_icon_state = "ling_toggle_breath"
|
||||
genomecost = 0
|
||||
isVerb = 0
|
||||
verbpath = /mob/proc/changeling_self_respiration
|
||||
|
||||
//No breathing required
|
||||
/mob/proc/changeling_self_respiration()
|
||||
set category = "Changeling"
|
||||
set name = "Toggle Breathing"
|
||||
set desc = "We choose whether or not to breathe."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
|
||||
if(!changeling)
|
||||
return 0
|
||||
|
||||
if(istype(src,/mob/living/carbon))
|
||||
var/mob/living/carbon/C = src
|
||||
if(C.suiciding)
|
||||
src << "You're committing suicide, this isn't going to work."
|
||||
return 0
|
||||
if(C.does_not_breathe == 0)
|
||||
C.does_not_breathe = 1
|
||||
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
|
||||
return 1
|
||||
else
|
||||
C.does_not_breathe = 0
|
||||
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
|
||||
return 0
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/game_mode/conflux
|
||||
name = "Wizard & Cult"
|
||||
name = "Technomancer & Cult"
|
||||
round_description = "A space wizard and a cult have invaded the station!"
|
||||
extended_round_description = "Cultists and wizards spawn during this round."
|
||||
config_tag = "conflux"
|
||||
@@ -7,6 +7,6 @@
|
||||
required_players_secret = 15
|
||||
required_enemies = 5
|
||||
end_on_antag_death = 1
|
||||
antag_tags = list(MODE_WIZARD, MODE_CULTIST)
|
||||
antag_tags = list(MODE_TECHNOMANCER, MODE_CULTIST)
|
||||
require_all_templates = 1
|
||||
votable = 0
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/game_mode/lizard
|
||||
name = "Wizard & Changelings"
|
||||
name = "Technomancer & Changelings"
|
||||
round_description = "A space wizard and changelings have invaded the station!"
|
||||
extended_round_description = "Changelings and a wizard spawn during this round."
|
||||
config_tag = "lizard"
|
||||
@@ -7,5 +7,6 @@
|
||||
required_players_secret = 8
|
||||
required_enemies = 3
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_WIZARD, MODE_CHANGELING)
|
||||
antag_tags = list(MODE_TECHNOMANCER, MODE_CHANGELING)
|
||||
require_all_templates = 1
|
||||
votable = 0
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/game_mode/mercwiz
|
||||
name = "Mercenaries & Wizard"
|
||||
name = "Mercenaries & Technomancer"
|
||||
round_description = "A mercenary team and a wizard have invaded the station!"
|
||||
extended_round_description = "Mercenaries and wizard spawn during this round."
|
||||
config_tag = "mercwiz"
|
||||
@@ -7,5 +7,6 @@
|
||||
required_players_secret = 15 //I don't think we can have it lower and not need an ERT every round.
|
||||
required_enemies = 7
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_MERCENARY, MODE_WIZARD)
|
||||
antag_tags = list(MODE_MERCENARY, MODE_TECHNOMANCER)
|
||||
require_all_templates = 1
|
||||
votable = 0
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/game_mode/visitors
|
||||
name = "Wizard & Ninja"
|
||||
name = "Technomancer & Ninja"
|
||||
round_description = "A space wizard and a ninja have invaded the station!"
|
||||
extended_round_description = "A ninja and wizard spawn during this round."
|
||||
config_tag = "visitors"
|
||||
@@ -7,5 +7,6 @@
|
||||
required_players_secret = 8
|
||||
required_enemies = 2
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_WIZARD, MODE_NINJA)
|
||||
antag_tags = list(MODE_TECHNOMANCER, MODE_NINJA)
|
||||
require_all_templates = 1
|
||||
votable = 0
|
||||
123
code/game/gamemodes/technomancer/assistance/assistance.dm
Normal file
123
code/game/gamemodes/technomancer/assistance/assistance.dm
Normal file
@@ -0,0 +1,123 @@
|
||||
/datum/technomancer/assistance
|
||||
var/one_use_only = 0
|
||||
|
||||
/datum/technomancer/assistance/apprentice
|
||||
name = "Friendly Apprentice"
|
||||
desc = "A one-time use teleporter that sends a less powerful manipulator of space to you, who will do their best to protect \
|
||||
and serve you. They get their own catalog and can buy spells for themselves, however they have a smaller pool to buy with. \
|
||||
If you are unable to receive an apprentice, the teleporter can be refunded like most equipment by sliding it into the \
|
||||
catalog. Note that apprentices cannot purchase more apprentices."
|
||||
cost = 300
|
||||
obj_path = /obj/item/weapon/antag_spawner/technomancer_apprentice
|
||||
|
||||
/obj/item/weapon/antag_spawner
|
||||
w_class = 1
|
||||
var/used = 0
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T)
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice
|
||||
name = "apprentice teleporter"
|
||||
desc = "A teleportation device, which will bring a less potent manipulator of space to you."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "oldshieldoff"
|
||||
var/searching = 0
|
||||
var/datum/effect/effect/system/spark_spread/sparks
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/New()
|
||||
..()
|
||||
sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
sparks.set_up(5, 0, src)
|
||||
sparks.attach(loc)
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/Destroy()
|
||||
qdel(sparks)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/attack_self(mob/user)
|
||||
user << "<span class='notice'>Teleporter attempting to lock on to your apprentice.</span>"
|
||||
searching = 1
|
||||
icon_state = "oldshieldon"
|
||||
for(var/mob/observer/dead/O in player_list)
|
||||
if(!O.MayRespawn())
|
||||
continue
|
||||
if(jobban_isbanned(O, "Syndicate") || jobban_isbanned(O, "wizard"))
|
||||
continue
|
||||
if(O.client)
|
||||
if(O.client.prefs.be_special & BE_WIZARD)
|
||||
question(O.client)
|
||||
spawn(1 MINUTE)
|
||||
searching = 0
|
||||
if(!used)
|
||||
icon_state = "oldshieldoff"
|
||||
user << "<span class='warning'>The teleporter failed to find your apprentice. Perhaps you could try again later?</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/proc/question(var/client/C)
|
||||
spawn(0)
|
||||
if(!C)
|
||||
return
|
||||
var/response = alert(C, "Someone is requesting a Technomancer apprentice Would you like to play as one?",
|
||||
"Apprentice request","Yes", "No")
|
||||
if(response == "Yes")
|
||||
response = alert(C, "Are you sure you want to play as an apprentice?", "Apprentice request", "Yes", "No")
|
||||
if(!C || used || !searching)
|
||||
return
|
||||
if(response == "Yes")
|
||||
spawn_antag(C, get_turf(src))
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/spawn_antag(client/C, turf/T)
|
||||
sparks.start()
|
||||
var/mob/living/carbon/human/H = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(H)
|
||||
H.key = C.key
|
||||
|
||||
H << "<b>You are the Technomancer's apprentice! Your goal is to assist them in their mission at the [station_name()].</b>"
|
||||
H << "<b>Your service has not gone unrewarded, however. Studying under them, you have learned how to use a Manipulation Core \
|
||||
of your own. You also have a Catelog, to purchase your own functions and equipment as you see fit.</b>"
|
||||
H << "<b>It would be wise to speak to your master, and learn what their plans are for today.</b>"
|
||||
|
||||
spawn(1)
|
||||
technomancers.add_antagonist(H.mind, 0, 1, 0, 0, 0)
|
||||
equip_antag(H)
|
||||
used = 1
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/equip_antag(mob/technomancer_mob)
|
||||
var/datum/antagonist/technomancer/antag_datum = all_antag_types[MODE_TECHNOMANCER]
|
||||
antag_datum.equip_apprentice(technomancer_mob)
|
||||
|
||||
|
||||
/*
|
||||
// For when no one wants to play support.
|
||||
/datum/technomancer/assistance/golem
|
||||
name = "Friendly GOLEM unit"
|
||||
desc = "Teleports a specially designed synthetic unit to you, which is very durable, has an advanced AI, and can also use \
|
||||
functions. It knows Shield, Targeted Blink, Beam, Flame Tongue, Mend Wounds, and Mend Burns. It also has a large storage \
|
||||
capacity for energy, and due to it's synthetic nature, instability is less of an issue for them."
|
||||
cost = 350
|
||||
obj_path = null //TODO
|
||||
one_use_only = 1
|
||||
|
||||
/datum/technomancer/assistance/ninja
|
||||
name = "Neutral Cyberassassin"
|
||||
desc = "Someone almost as enigmatic as you will also arrive at your destination, with their own goals and motivations. \
|
||||
This could prove to be a problem if they decide to go against you, so this is only recommended as a challenge."
|
||||
cost = 100
|
||||
obj_path = null //TODO
|
||||
one_use_only = 1
|
||||
|
||||
// Hardmode.
|
||||
/datum/technomancer/assistance/enemy_technomancer
|
||||
name = "Enemy Technomancer"
|
||||
desc = "Another manipulator of space will arrive on the colony in addition to you, most likely wanting to oppose you in \
|
||||
some form, if you purchase this. This is only recommended as a challenge."
|
||||
cost = 100
|
||||
obj_path = null //TODO
|
||||
one_use_only = 1
|
||||
*/
|
||||
72
code/game/gamemodes/technomancer/assistance/golem.dm
Normal file
72
code/game/gamemodes/technomancer/assistance/golem.dm
Normal file
@@ -0,0 +1,72 @@
|
||||
//An AI-controlled 'companion' for the Technomancer. It's tough, strong, and can also use spells.
|
||||
/mob/living/simple_animal/hostile/technomancer_golem
|
||||
name = "G.O.L.E.M."
|
||||
desc = "A rather unusual looking synthetic."
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "Security"
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
stop_automated_movement = 1
|
||||
wander = 0
|
||||
response_help = "pets"
|
||||
response_disarm = "pushes away"
|
||||
response_harm = "punches"
|
||||
harm_intent_damage = 3
|
||||
|
||||
heat_damage_per_tick = 0
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
speed = 0
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attacktext = "pummeled"
|
||||
attack_sound = null
|
||||
friendly = "hugs"
|
||||
resistance = 0
|
||||
|
||||
var/obj/item/weapon/technomancer_core/core = null
|
||||
var/obj/item/weapon/spell/active_spell = null
|
||||
var/mob/living/master = null
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/New()
|
||||
..()
|
||||
core = new core(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/Destroy()
|
||||
qdel(core)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/proc/bind_to_mob(mob/user)
|
||||
if(!user || master)
|
||||
return
|
||||
master = user
|
||||
name = "[master]'s [initial(name)]"
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/examine(mob/user)
|
||||
..()
|
||||
if(user.mind && technomancers.is_antagonist(user.mind))
|
||||
user << "Your pride and joy. It's a very special synthetic robot, capable of using functions similar to you, and you built it \
|
||||
yourself! It'll always stand by your side, ready to help you out. You have no idea what GOLEM stands for, however..."
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/Life()
|
||||
handle_ai()
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/proc/handle_ai()
|
||||
if(!master)
|
||||
return
|
||||
if(get_dist(src, master) > 6 || src.z != master.z)
|
||||
recall_to_master()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/technomancer_golem/proc/recall_to_master()
|
||||
return
|
||||
272
code/game/gamemodes/technomancer/catalog.dm
Normal file
272
code/game/gamemodes/technomancer/catalog.dm
Normal file
@@ -0,0 +1,272 @@
|
||||
var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell
|
||||
var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment
|
||||
var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable
|
||||
var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance
|
||||
var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datum/technomancer/presets
|
||||
|
||||
/datum/technomancer
|
||||
var/name = "technomancer thing"
|
||||
var/desc = "If you can see this, something broke."
|
||||
var/enhancement_desc = "No effect."
|
||||
var/cost = 100
|
||||
var/hidden = 0
|
||||
var/obj_path = null
|
||||
var/ability_icon_state = null
|
||||
|
||||
/obj/item/weapon/technomancer_catalog
|
||||
name = "catalog"
|
||||
desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \
|
||||
requisition various things from.. where ever they came from."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state ="scientology" //placeholder
|
||||
w_class = 2
|
||||
var/budget = 1000
|
||||
var/max_budget = 1000
|
||||
var/mob/living/carbon/human/owner = null
|
||||
var/list/spell_instances = list()
|
||||
var/list/equipment_instances = list()
|
||||
var/list/consumable_instances = list()
|
||||
var/list/assistance_instances = list()
|
||||
var/list/preset_instances = list()
|
||||
var/tab = 0
|
||||
var/show_scepter_text = 0
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/apprentice
|
||||
name = "apprentice's catelog"
|
||||
budget = 700
|
||||
max_budget = 700
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/master //for badmins, I suppose
|
||||
name = "master's catelog"
|
||||
budget = 2000
|
||||
max_budget = 2000
|
||||
|
||||
|
||||
// Proc: bind_to_owner()
|
||||
// Parameters: 1 (new_owner - mob that the book is trying to bind to)
|
||||
// Description: Links the catelog to hopefully the technomancer, so that only they can access it.
|
||||
/obj/item/weapon/technomancer_catalog/proc/bind_to_owner(var/mob/living/carbon/human/new_owner)
|
||||
if(!owner && technomancers.is_antagonist(new_owner.mind))
|
||||
owner = new_owner
|
||||
|
||||
// Proc: New()
|
||||
// Parameters: 0
|
||||
// Description: Sets up the catelog, as shown below.
|
||||
/obj/item/weapon/technomancer_catalog/New()
|
||||
..()
|
||||
set_up()
|
||||
|
||||
// Proc: set_up()
|
||||
// Parameters: 0
|
||||
// Description: Instantiates all the catelog datums for everything that can be bought.
|
||||
/obj/item/weapon/technomancer_catalog/proc/set_up()
|
||||
if(!spell_instances.len)
|
||||
for(var/S in all_technomancer_spells)
|
||||
spell_instances += new S()
|
||||
if(!equipment_instances.len)
|
||||
for(var/E in all_technomancer_equipment)
|
||||
equipment_instances += new E()
|
||||
if(!consumable_instances.len)
|
||||
for(var/C in all_technomancer_consumables)
|
||||
consumable_instances += new C()
|
||||
if(!assistance_instances.len)
|
||||
for(var/A in all_technomancer_assistance)
|
||||
assistance_instances += new A()
|
||||
if(!preset_instances.len)
|
||||
for(var/P in all_technomancer_presets)
|
||||
preset_instances += new P()
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/apprentice/set_up()
|
||||
..()
|
||||
for(var/datum/technomancer/assistance/apprentice/A in assistance_instances)
|
||||
assistance_instances.Remove(A)
|
||||
|
||||
// Proc: attack_self()
|
||||
// Parameters: 1 (user - the mob clicking on the catelog)
|
||||
// Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used.
|
||||
/obj/item/weapon/technomancer_catalog/attack_self(mob/user)
|
||||
if(!user)
|
||||
return 0
|
||||
if(owner && user != owner)
|
||||
user << "<span class='danger'>\The [src] knows that you're not the original owner, and has locked you out of it!</span>"
|
||||
return 0
|
||||
else if(!owner)
|
||||
bind_to_owner(user)
|
||||
|
||||
switch(tab)
|
||||
if(0) //Functions
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><b>Functions</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];refund_functions=1'>Refund Functions</a><br><br>"
|
||||
for(var/datum/technomancer/spell in spell_instances)
|
||||
if(spell.hidden)
|
||||
continue
|
||||
dat += "<b>[spell.name]</b><br>"
|
||||
dat += "<i>[spell.desc]</i><br>"
|
||||
if(show_scepter_text)
|
||||
dat += "<span class='info'><i>[spell.enhancement_desc]</i></span>"
|
||||
if(spell.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];spell_choice=[spell.name]'>Purchase</a> ([spell.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
if(1) //Equipment
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<b>Equipment</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/equipment/E in equipment_instances)
|
||||
dat += "<b>[E.name]</b><br>"
|
||||
dat += "<i>[E.desc]</i><br>"
|
||||
if(E.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];item_choice=[E.name]'>Purchase</a> ([E.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
if(2) //Consumables
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<b>Consumables</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/consumable/C in consumable_instances)
|
||||
dat += "<b>[C.name]</b><br>"
|
||||
dat += "<i>[C.desc]</i><br>"
|
||||
if(C.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];item_choice=[C.name]'>Purchase</a> ([C.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
if(3) //Assistance
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<b>Assistance</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/assistance/A in assistance_instances)
|
||||
dat += "<b>[A.name]</b><br>"
|
||||
dat += "<i>[A.desc]</i><br>"
|
||||
if(A.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];item_choice=[A.name]'>Purchase</a> ([A.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
if(4) //Presets
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<b>Presets</b></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/presets/P in preset_instances)
|
||||
dat += "<b>[P.name]</b><br>"
|
||||
dat += "<i>[P.desc]</i><br>"
|
||||
if(P.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];spell_choice=[P.name]'>Purchase</a> ([P.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
|
||||
// Proc: Topic()
|
||||
// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.)
|
||||
// Description: Acts upon clicks on links for the catelog, if they are the rightful owner.
|
||||
/obj/item/weapon/technomancer_catalog/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
if(H.stat || H.restrained())
|
||||
return
|
||||
if(!istype(H, /mob/living/carbon/human))
|
||||
return 1 //why does this return 1?
|
||||
|
||||
if(H != owner)
|
||||
H << "\The [src] won't allow you to do that, as you don't own \the [src]!"
|
||||
return
|
||||
|
||||
if(loc == H || (in_range(src, H) && istype(loc, /turf)))
|
||||
H.set_machine(src)
|
||||
if(href_list["tab_choice"])
|
||||
tab = text2num(href_list["tab_choice"])
|
||||
if(href_list["spell_choice"])
|
||||
var/datum/technomancer/new_spell = null
|
||||
//Locate the spell.
|
||||
for(var/datum/technomancer/spell/spell in spell_instances)
|
||||
if(spell.name == href_list["spell_choice"])
|
||||
new_spell = spell
|
||||
break
|
||||
|
||||
var/obj/item/weapon/technomancer_core/core = null
|
||||
if(istype(H.back, /obj/item/weapon/technomancer_core))
|
||||
core = H.back
|
||||
|
||||
if(new_spell && core)
|
||||
if(new_spell.cost <= budget)
|
||||
if(!core.has_spell(new_spell))
|
||||
budget -= new_spell.cost
|
||||
H << "<span class='notice'>You have just bought [new_spell.name].</span>"
|
||||
core.add_spell(new_spell.obj_path, new_spell.name, new_spell.ability_icon_state)
|
||||
else //We already own it.
|
||||
H << "<span class='danger'>You already have [new_spell.name]!</span>"
|
||||
return
|
||||
else //Can't afford.
|
||||
H << "<span class='danger'>You can't afford that!</span>"
|
||||
return
|
||||
|
||||
// This needs less copypasta.
|
||||
if(href_list["item_choice"])
|
||||
var/datum/technomancer/desired_object = null
|
||||
for(var/datum/technomancer/O in equipment_instances + consumable_instances + assistance_instances)
|
||||
if(O.name == href_list["item_choice"])
|
||||
desired_object = O
|
||||
break
|
||||
|
||||
if(desired_object)
|
||||
if(desired_object.cost <= budget)
|
||||
budget -= desired_object.cost
|
||||
H << "<span class='notice'>You have just bought \a [desired_object.name].</span>"
|
||||
var/obj/O = new desired_object.obj_path(get_turf(H))
|
||||
technomancer_belongings.Add(O) // Used for the Track spell.
|
||||
|
||||
else //Can't afford.
|
||||
H << "<span class='danger'>You can't afford that!</span>"
|
||||
return
|
||||
|
||||
|
||||
if(href_list["refund_functions"])
|
||||
if(H.z != 2)
|
||||
H << "<span class='danger'>You can only refund at your base, it's too late now!</span>"
|
||||
return
|
||||
var/obj/item/weapon/technomancer_core/core = null
|
||||
if(istype(H.back, /obj/item/weapon/technomancer_core))
|
||||
core = H.back
|
||||
if(core)
|
||||
for(var/obj/spellbutton/spell in core.spells)
|
||||
for(var/datum/technomancer/spell/spell_datum in spell_instances)
|
||||
if(spell_datum.obj_path == spell.spellpath && !spell.was_bought_by_preset)
|
||||
budget += spell_datum.cost
|
||||
core.remove_spell(spell)
|
||||
break
|
||||
attack_self(H)
|
||||
42
code/game/gamemodes/technomancer/clothing.dm
Normal file
42
code/game/gamemodes/technomancer/clothing.dm
Normal file
@@ -0,0 +1,42 @@
|
||||
/obj/item/clothing/suit/technomancer
|
||||
name = "chrome manipulation suit"
|
||||
desc = "It's a very shiny and somewhat protective suit, built to help carry cores on the user's back."
|
||||
icon_state = "technomancer_suit"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS|FEET|HANDS
|
||||
allowed = list(/obj/item/weapon/tank)
|
||||
armor = list(melee = 50, bullet = 20, laser = 30, energy = 30, bomb = 10, bio = 0, rad = 40)
|
||||
siemens_coefficient = 0.75
|
||||
|
||||
/obj/item/clothing/under/technomancer
|
||||
name = "initiate's jumpsuit"
|
||||
desc = "It's a blue colored jumpsuit. There appears to be light-weight armor padding underneath, providing some protection."
|
||||
icon_state = "initiate"
|
||||
armor = list(melee = 10, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
/obj/item/clothing/under/technomancer/apprentice
|
||||
name = "apprentice's jumpsuit"
|
||||
desc = "It's a blue colored jumpsuit with some silver markings. There appears to be light-weight armor padding \
|
||||
underneath, providing some protection."
|
||||
icon_state = "apprentice"
|
||||
|
||||
/obj/item/clothing/under/technomancer/master
|
||||
name = "master's jumpsuit"
|
||||
desc = "It's a blue colored jumpsuit with some gold markings. There appears to be light-weight armor padding \
|
||||
underneath, providing some protection."
|
||||
icon_state = "technomancer"
|
||||
|
||||
/obj/item/clothing/head/technomancer
|
||||
name = "initiate's hat"
|
||||
desc = "It's a somewhat silly looking blue pointed hat."
|
||||
icon_state = "initiate"
|
||||
|
||||
/obj/item/clothing/head/technomancer/apprentice
|
||||
name = "apprentice's hat"
|
||||
desc = "It's a somewhat silly looking blue pointed hat. This one has a silver colored metalic feather strapped to it."
|
||||
icon_state = "apprentice"
|
||||
|
||||
/obj/item/clothing/head/technomancer/master
|
||||
name = "master's hat"
|
||||
desc = "It's a somewhat silly looking blue pointed hat. This one has a gold colored metalic feather strapped to it."
|
||||
icon_state = "technomancer"
|
||||
290
code/game/gamemodes/technomancer/core_obj.dm
Normal file
290
code/game/gamemodes/technomancer/core_obj.dm
Normal file
@@ -0,0 +1,290 @@
|
||||
//The base core object, worn on the wizard's back.
|
||||
/obj/item/weapon/technomancer_core
|
||||
name = "manipulation core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats."
|
||||
icon = 'icons/obj/technomancer.dmi'
|
||||
icon_state = "technomancer_core"
|
||||
item_state = "technomancer_core"
|
||||
w_class = 5
|
||||
slot_flags = SLOT_BACK
|
||||
unacidable = 1
|
||||
origin_tech = list(
|
||||
TECH_MATERIAL = 8, TECH_ENGINEERING = 8, TECH_POWER = 8, TECH_BLUESPACE = 10,
|
||||
TECH_COMBAT = 7, TECH_MAGNET = 9, TECH_DATA = 5
|
||||
)
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/back.dmi'
|
||||
)
|
||||
var/energy = 10000
|
||||
var/max_energy = 10000
|
||||
var/regen_rate = 50 // 200 seconds to full
|
||||
var/energy_delta = 0 // How much we're gaining (or perhaps losing) every process().
|
||||
var/mob/living/wearer = null // Reference to the mob wearing the core.
|
||||
var/instability_modifer = 0.8 // Multiplier on how much instability is added.
|
||||
var/list/spells = list() // This contains the buttons used to make spells in the user's hand.
|
||||
var/list/appearances = list( // Assoc list containing possible icon_states that the wiz can change the core to.
|
||||
"default" = "technomancer_core",
|
||||
"wizard's cloak" = "wizard_cloak"
|
||||
)
|
||||
|
||||
// Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than \
|
||||
// mind datums. It may also allow creative players to try to pull off a 'soul jar' scenario.
|
||||
var/list/summoned_mobs = list() // Maintained horribly with maintain_summon_list().
|
||||
var/list/wards_in_use = list() // Wards don't count against the cap for other summons.
|
||||
var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps.
|
||||
|
||||
/obj/item/weapon/technomancer_core/New()
|
||||
..()
|
||||
processing_objects |= src
|
||||
|
||||
/obj/item/weapon/technomancer_core/Destroy()
|
||||
dismiss_all_summons()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
// Add the spell buttons to the HUD.
|
||||
/obj/item/weapon/technomancer_core/equipped(mob/user)
|
||||
wearer = user
|
||||
for(var/obj/spellbutton/spell in spells)
|
||||
wearer.ability_master.add_technomancer_ability(spell, spell.ability_icon_state)
|
||||
..()
|
||||
|
||||
// Removes the spell buttons from the HUD.
|
||||
/obj/item/weapon/technomancer_core/dropped(mob/user)
|
||||
for(var/obj/screen/ability/obj_based/technomancer/A in wearer.ability_master.ability_objects)
|
||||
wearer.ability_master.remove_ability(A)
|
||||
wearer = null
|
||||
..()
|
||||
|
||||
// 'pay_energy' is too vague of a name for a proc at the mob level.
|
||||
/mob/proc/technomancer_pay_energy(amount)
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/technomancer_pay_energy(amount)
|
||||
if(istype(back, /obj/item/weapon/technomancer_core))
|
||||
var/obj/item/weapon/technomancer_core/TC = back
|
||||
return TC.pay_energy(amount)
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/pay_energy(amount)
|
||||
if(amount <= energy)
|
||||
energy = max(energy - amount, 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/give_energy(amount)
|
||||
energy = min(energy + amount, max_energy)
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/technomancer_core/process()
|
||||
var/old_energy = energy
|
||||
regenerate()
|
||||
pay_dues()
|
||||
energy_delta = energy - old_energy
|
||||
if(world.time % 5 == 0) // Maintaining fat lists is expensive, I imagine.
|
||||
maintain_summon_list()
|
||||
if(wearer && wearer.mind)
|
||||
if(!(technomancers.is_antagonist(wearer.mind))) // In case someone tries to wear a stolen core.
|
||||
wearer.adjust_instability(20)
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/regenerate()
|
||||
energy = min(max(energy + regen_rate, 0), max_energy)
|
||||
if(wearer && ishuman(wearer))
|
||||
var/mob/living/carbon/human/H = wearer
|
||||
H.wiz_energy_update_hud()
|
||||
|
||||
// We pay for on-going effects here.
|
||||
/obj/item/weapon/technomancer_core/proc/pay_dues()
|
||||
if(summoned_mobs.len)
|
||||
pay_energy( round(summoned_mobs.len * 5) )
|
||||
|
||||
// Because sometimes our summoned mobs will stop existing and leave a null entry in the list, we need to do cleanup every
|
||||
// so often so .len remains reliable.
|
||||
/obj/item/weapon/technomancer_core/proc/maintain_summon_list()
|
||||
if(!summoned_mobs.len) // No point doing work if there's no work to do.
|
||||
return
|
||||
for(var/A in summoned_mobs)
|
||||
// First, a null check.
|
||||
if(isnull(A))
|
||||
summoned_mobs -= A
|
||||
continue
|
||||
// Now check for dead mobs who shouldn't be on the list.
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/L = A
|
||||
if(L.stat == DEAD)
|
||||
summoned_mobs -= L
|
||||
qdel(L)
|
||||
|
||||
// Deletes all the summons and wards from the core, so that Destroy() won't have issues.
|
||||
/obj/item/weapon/technomancer_core/proc/dismiss_all_summons()
|
||||
for(var/mob/living/L in summoned_mobs)
|
||||
summoned_mobs -= L
|
||||
qdel(L)
|
||||
for(var/mob/living/simple_animal/ward/ward in wards_in_use)
|
||||
wards_in_use -= ward
|
||||
qdel(ward)
|
||||
|
||||
// This is what is clicked on to place a spell in the user's hands.
|
||||
/obj/spellbutton
|
||||
name = "generic spellbutton"
|
||||
var/spellpath = null
|
||||
var/obj/item/weapon/technomancer_core/core = null
|
||||
var/was_bought_by_preset = 0 // Relevant for refunding via the spellbook. Presets may be priced differently.
|
||||
var/ability_icon_state = null
|
||||
|
||||
/obj/spellbutton/New(loc, var/path, var/new_name, var/new_icon_state)
|
||||
if(!path || !ispath(path))
|
||||
message_admins("ERROR: /obj/spellbutton/New() was not given a proper path!")
|
||||
qdel(src)
|
||||
src.name = new_name
|
||||
src.spellpath = path
|
||||
src.loc = loc
|
||||
src.core = loc
|
||||
src.ability_icon_state = new_icon_state
|
||||
|
||||
/obj/spellbutton/Click()
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.place_spell_in_hand(spellpath)
|
||||
|
||||
/obj/spellbutton/DblClick()
|
||||
return Click()
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
. = ..()
|
||||
|
||||
if(. && istype(back,/obj/item/weapon/technomancer_core))
|
||||
var/obj/item/weapon/technomancer_core/core = back
|
||||
setup_technomancer_stat(core)
|
||||
|
||||
/mob/living/carbon/human/proc/setup_technomancer_stat(var/obj/item/weapon/technomancer_core/core)
|
||||
if(core && statpanel("Spell Core"))
|
||||
var/charge_status = "[core.energy]/[core.max_energy] ([round( (core.energy / core.max_energy) * 100)]%) \
|
||||
([round(core.energy_delta)]/s)"
|
||||
var/instability_status = "[src.instability]"
|
||||
stat("Core charge", charge_status)
|
||||
stat("User instability", instability_status)
|
||||
for(var/obj/spellbutton/button in core.spells)
|
||||
stat(button)
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/add_spell(var/path, var/new_name, var/ability_icon_state)
|
||||
if(!path || !ispath(path))
|
||||
message_admins("ERROR: /obj/item/weapon/technomancer_core/add_spell() was not given a proper path! \
|
||||
The path supplied was [path].")
|
||||
return
|
||||
var/obj/spellbutton/spell = new(src, path, new_name, ability_icon_state)
|
||||
spells.Add(spell)
|
||||
if(wearer)
|
||||
wearer.ability_master.add_technomancer_ability(spell, ability_icon_state)
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/remove_spell(var/obj/spellbutton/spell_to_remove)
|
||||
if(spell_to_remove in spells)
|
||||
spells.Remove(spell_to_remove)
|
||||
if(wearer)
|
||||
var/obj/screen/ability/obj_based/technomancer/A = wearer.ability_master.get_ability_by_instance(spell_to_remove)
|
||||
if(A)
|
||||
wearer.ability_master.remove_ability(A)
|
||||
qdel(spell_to_remove)
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/remove_all_spells()
|
||||
for(var/obj/spellbutton/spell in spells)
|
||||
spells.Remove(spell)
|
||||
qdel(spell)
|
||||
|
||||
/obj/item/weapon/technomancer_core/proc/has_spell(var/datum/technomancer/spell_to_check)
|
||||
for(var/obj/spellbutton/spell in spells)
|
||||
if(spell.spellpath == spell_to_check.obj_path)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/proc/wiz_energy_update_hud()
|
||||
if(client && hud_used)
|
||||
if(istype(back, /obj/item/weapon/technomancer_core)) //I reckon there's a better way of doing this.
|
||||
var/obj/item/weapon/technomancer_core/core = back
|
||||
wiz_energy_display.invisibility = 0
|
||||
var/ratio = core.energy / core.max_energy
|
||||
ratio = max(round(ratio, 0.05) * 100, 5)
|
||||
wiz_energy_display.icon_state = "wiz_energy[ratio]"
|
||||
else
|
||||
wiz_energy_display.invisibility = 101
|
||||
|
||||
//Resonance Aperture
|
||||
|
||||
//Variants which the wizard can buy.
|
||||
|
||||
//High risk, high reward core.
|
||||
/obj/item/weapon/technomancer_core/unstable
|
||||
name = "unstable core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This one is rather unstable, \
|
||||
and could prove dangerous to the user, as it feeds off unstable energies that can occur with overuse of this machine."
|
||||
energy = 13000
|
||||
max_energy = 13000
|
||||
regen_rate = 35 //~371 seconds to full, 118 seconds to full at 50 instability (rate of 110)
|
||||
instability_modifer = 1.2
|
||||
|
||||
/obj/item/weapon/technomancer_core/unstable/regenerate()
|
||||
var/instability_bonus = 0
|
||||
if(loc && ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
instability_bonus = H.instability * 1.5
|
||||
energy = min(energy + regen_rate + instability_bonus, max_energy)
|
||||
if(loc && ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.wiz_energy_update_hud()
|
||||
|
||||
//Lower capacity but safer core.
|
||||
/obj/item/weapon/technomancer_core/rapid
|
||||
name = "rapid core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This one has a superior \
|
||||
recharge rate, at the price of storage capacity. It also includes integrated motion assistance, increasing agility somewhat."
|
||||
energy = 7000
|
||||
max_energy = 7000
|
||||
regen_rate = 70 //100 seconds to full
|
||||
slowdown = -1
|
||||
instability_modifer = 0.9
|
||||
|
||||
//Big batteries but slow regen, buying energy spells is highly recommended.
|
||||
/obj/item/weapon/technomancer_core/bulky
|
||||
name = "bulky core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This variant is more \
|
||||
cumbersome and bulky, due to the additional energy capacitors installed. It also comes at a price of a subpar fractal \
|
||||
reactor."
|
||||
energy = 20000
|
||||
max_energy = 20000
|
||||
regen_rate = 25 //800 seconds to full
|
||||
slowdown = 1
|
||||
instability_modifer = 1.0
|
||||
|
||||
// Using this can result in abilities costing less energy. If you're lucky.
|
||||
/obj/item/weapon/technomancer_core/recycling
|
||||
name = "recycling core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type tries to recover \
|
||||
some of the energy lost from using functions due to inefficiency."
|
||||
energy = 12000
|
||||
max_energy = 12000
|
||||
regen_rate = 40 //300 seconds to full
|
||||
instability_modifer = 0.6
|
||||
|
||||
/obj/item/weapon/technomancer_core/recycling/pay_energy(amount)
|
||||
..()
|
||||
if(.)
|
||||
if(prob(30))
|
||||
give_energy(round(amount / 2))
|
||||
if(amount >= 100) // Managing to recover less than half of this isn't worth telling the user about.
|
||||
wearer << "<span class='notice'>\The [src] has recovered [amount/2 >= 1000 ? "a lot of" : "some"] energy.</span>"
|
||||
|
||||
// For those dedicated to summoning hoards of things.
|
||||
/obj/item/weapon/technomancer_core/summoner
|
||||
name = "summoner core"
|
||||
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is optimized for \
|
||||
plucking hapless creatures and machines from other locations, to do your bidding. The maximum amount of entities that you can \
|
||||
bring over at once is higher with this core, up to 40 entities, and the maintenance cost is significantly lower."
|
||||
energy = 8000
|
||||
max_energy = 8000
|
||||
regen_rate = 35 //228 seconds to full
|
||||
max_summons = 40
|
||||
instability_modifer = 1.0
|
||||
|
||||
/obj/item/weapon/technomancer_core/summoner/pay_dues()
|
||||
if(summoned_mobs.len)
|
||||
pay_energy( round(summoned_mobs.len) )
|
||||
19
code/game/gamemodes/technomancer/devices/boots_of_speed.dm
Normal file
19
code/game/gamemodes/technomancer/devices/boots_of_speed.dm
Normal file
@@ -0,0 +1,19 @@
|
||||
/datum/technomancer/equipment/boots_of_speed
|
||||
name = "Boots of Speed"
|
||||
desc = "What appears to be an ordinary pair of boots, is actually a bit more useful than that. These will help against slipping \
|
||||
on flat surfaces, and will make you run a bit faster than if you had normal shoes or boots on."
|
||||
cost = 50
|
||||
obj_path = /obj/item/clothing/shoes/speed
|
||||
|
||||
/obj/item/clothing/shoes/speed
|
||||
name = "boots of speed"
|
||||
desc = "The latest in sure footing technology."
|
||||
icon_state = "swat"
|
||||
item_flags = NOSLIP
|
||||
siemens_coefficient = 0.6
|
||||
slowdown = -2 // A bit faster than normal shows.
|
||||
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = FEET
|
||||
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
@@ -0,0 +1,80 @@
|
||||
/datum/technomancer/consumable/disposable_teleporter
|
||||
name = "Disposable Teleporter"
|
||||
desc = "An ultra-safe teleportation device that can directly teleport you to a number of locations at minimal risk, however \
|
||||
it has a limited amount of charges."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/disposable_teleporter
|
||||
|
||||
/obj/item/weapon/disposable_teleporter
|
||||
name = "disposable teleporter"
|
||||
desc = "A very compact personal teleportation device. It's very precise and safe, however it can only be used a few times."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "hand_tele" //temporary
|
||||
var/uses = 3.0
|
||||
w_class = 1
|
||||
item_state = "paper"
|
||||
origin_tech = list(TECH_BLUESPACE = 4, TECH_POWER = 3)
|
||||
|
||||
//This one is what the wizard starts with. The above is a better version that can be purchased.
|
||||
/obj/item/weapon/disposable_teleporter/free
|
||||
name = "complimentary disposable teleporter"
|
||||
desc = "A very compact personal teleportation device. It's very precise and safe, however it can only be used once. This \
|
||||
one has been provided to allow you to leave your hideout."
|
||||
uses = 1
|
||||
|
||||
/obj/item/weapon/disposable_teleporter/examine(mob/user)
|
||||
..()
|
||||
user << "[uses] uses remaining."
|
||||
|
||||
/obj/item/weapon/disposable_teleporter/attack_self(mob/user as mob)
|
||||
if(!uses)
|
||||
user << "<span class='danger'>\The [src] has ran out of uses, and is now useless to you!</span>"
|
||||
return
|
||||
else
|
||||
var/area_wanted = input(user, "Area to teleport to", "Teleportation") in teleportlocs
|
||||
var/area/A = teleportlocs[area_wanted]
|
||||
if(!A)
|
||||
return
|
||||
|
||||
if (user.stat || user.restrained())
|
||||
return
|
||||
|
||||
if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf)))))
|
||||
return
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(5, 0, user.loc)
|
||||
sparks.attach(user)
|
||||
sparks.start()
|
||||
|
||||
if(user && user.buckled)
|
||||
user.buckled.unbuckle_mob()
|
||||
|
||||
var/list/targets = list()
|
||||
|
||||
//Copypasta
|
||||
valid_turfs:
|
||||
for(var/turf/simulated/T in A.contents)
|
||||
if(T.density || istype(T, /turf/simulated/mineral)) //Don't blink to vacuum or a wall
|
||||
continue
|
||||
for(var/atom/movable/stuff in T.contents)
|
||||
if(stuff.density)
|
||||
continue valid_turfs
|
||||
targets.Add(T)
|
||||
|
||||
if(!targets.len)
|
||||
user << "The teleporter matrix was unable to locate a suitable teleport destination, as all the possibilities \
|
||||
were nonexistant or hazardous. Try a different area."
|
||||
return
|
||||
var/turf/simulated/destination = null
|
||||
|
||||
destination = pick(targets)
|
||||
|
||||
if(destination)
|
||||
user.forceMove(destination)
|
||||
user << "<span class='notice'>You are teleported to \the [A].</span>"
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
user << "<span class='danger'>\The [src] has ran out of uses, and disintegrates from your hands, to prevent \
|
||||
reverse engineering by outsiders.</span>"
|
||||
qdel(src)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user