Polaris sync

This commit is contained in:
Eearslya
2016-08-06 20:34:44 -07:00
566 changed files with 16223 additions and 7350 deletions

View File

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

View File

@@ -37,5 +37,5 @@
// Chemistry lists. // Chemistry lists.
var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") // Increase heart rate. 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/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 var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional

View File

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

View File

@@ -156,7 +156,7 @@
// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects, // 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. // 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) if(!recursion_limit)
return L return L
@@ -176,7 +176,7 @@
else if(istype(I,/obj/)) else if(istype(I,/obj/))
var/obj/check_obj = I var/obj/check_obj = I
if(check_obj.show_messages) if(ignore_show_messages || check_obj.show_messages)
if(!sight_check || isInSight(I, O)) if(!sight_check || isInSight(I, O))
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
if(include_objects) if(include_objects)

View File

@@ -119,27 +119,12 @@ proc/age2agedescription(age)
if(70 to INFINITY) return "elderly" if(70 to INFINITY) return "elderly"
else return "unknown" else return "unknown"
proc/RoundHealth(health) /proc/RoundHealth(health)
switch(health) var/list/icon_states = icon_states('icons/mob/hud_med.dmi')
if(100 to INFINITY) for(var/icon_state in icon_states)
return "health100" if(health >= text2num(icon_state))
if(70 to 100) return icon_state
return "health80" return icon_states[icon_states.len] // If we had no match, return the last element
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 for attack log creation, because really why not Proc for attack log creation, because really why not

View File

@@ -1037,12 +1037,6 @@ proc/get_mob_with_client_list()
else if (zone == "r_foot") return "right foot" else if (zone == "r_foot") return "right foot"
else return zone 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) /proc/get(atom/loc, type)
while(loc) while(loc)
if(istype(loc, type)) if(istype(loc, type))

View File

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

View File

@@ -103,6 +103,9 @@
#define ui_alien_health "EAST-1:28,CENTER-1:13" //aliens have the health display where humans have the pressure damage indicator. #define ui_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_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 //Pop-up inventory
#define ui_shoes "WEST+1:8,SOUTH:5" #define ui_shoes "WEST+1:8,SOUTH:5"
@@ -137,5 +140,5 @@
#define ui_iarrowleft "SOUTH-1,EAST-4" #define ui_iarrowleft "SOUTH-1,EAST-4"
#define ui_iarrowright "SOUTH-1,EAST-2" #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" #define ui_genetic_master "EAST-1:16,NORTH-3:16"

View File

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

View File

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

View File

@@ -303,6 +303,17 @@
mymob.ling_chem_display.icon_state = "ling_chems" mymob.ling_chem_display.icon_state = "ling_chems"
hud_elements |= mymob.ling_chem_display 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.pain = new /obj/screen( null )
mymob.zone_sel = new /obj/screen/zone_sel( null ) mymob.zone_sel = new /obj/screen/zone_sel( null )
@@ -371,3 +382,15 @@
/obj/screen/ling/chems /obj/screen/ling/chems
name = "chemical storage" name = "chemical storage"
icon_state = "power_display" icon_state = "power_display"
/obj/screen/wizard
invisibility = 101
/obj/screen/wizard/instability
name = "instability"
icon_state = "instability-1"
invisibility = 0
/obj/screen/wizard/energy
name = "energy"
icon_state = "wiz_energy"

View File

@@ -223,6 +223,17 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttles["Administration"] = shuttle shuttles["Administration"] = shuttle
process_shuttles += 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 = new()
shuttle.area_offsite = locate(/area/shuttle/alien/base) shuttle.area_offsite = locate(/area/shuttle/alien/base)
shuttle.area_station = locate(/area/shuttle/alien/mine) shuttle.area_station = locate(/area/shuttle/alien/mine)

View File

@@ -120,7 +120,7 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f
if(choices[current_votes[key]] == .) if(choices[current_votes[key]] == .)
round_voters += key // Keep track of who voted for the winning round. 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 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 else
text += "<b>The vote has ended.</b>" text += "<b>The vote has ended.</b>"

View File

@@ -102,6 +102,15 @@ var/global/list/all_exonet_connections = list()
return exonet.address return exonet.address
return null 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() // 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") // 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. // Description: Sends the message to target_address, by calling receive_message() on the desired datum.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

@@ -81,3 +81,28 @@
containertype = /obj/structure/closet/crate/secure/large containertype = /obj/structure/closet/crate/secure/large
containername = "Disposal Dispenser Crate" containername = "Disposal Dispenser Crate"
access = access_atmospherics access = access_atmospherics
/datum/supply_packs/atmos/internals
name = "Internals crate"
contains = list(
/obj/item/clothing/mask/gas = 3,
/obj/item/weapon/tank/air = 3
)
cost = 10
containertype = /obj/structure/closet/crate/internals
containername = "Internals crate"
/datum/supply_packs/atmos/evacuation
name = "Emergency equipment"
contains = list(
/obj/item/weapon/storage/toolbox/emergency = 2,
/obj/item/clothing/suit/storage/hazardvest = 2,
/obj/item/clothing/suit/storage/vest = 2,
/obj/item/weapon/tank/emergency_oxygen/engi = 4,
/obj/item/clothing/suit/space/emergency = 4,
/obj/item/clothing/head/helmet/space/emergency = 4,
/obj/item/clothing/mask/gas = 4
)
cost = 35
containertype = /obj/structure/closet/crate/internals
containername = "Emergency crate"

View File

@@ -31,7 +31,7 @@
cost = 25 cost = 25
containertype = /obj/structure/closet/crate containertype = /obj/structure/closet/crate
containername = "Special Ops crate" containername = "Special Ops crate"
hidden = 1 contraband = 1
/datum/supply_packs/security/bolt_rifles_mosin /datum/supply_packs/security/bolt_rifles_mosin
name = "Surplus militia rifles" name = "Surplus militia rifles"
@@ -40,6 +40,6 @@
/obj/item/ammo_magazine/clip/a762 = 6 /obj/item/ammo_magazine/clip/a762 = 6
) )
cost = 50 cost = 50
hidden = 1 contraband = 1
containertype = /obj/structure/closet/crate/secure/weapon containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate" containername = "Weapons crate"

View File

@@ -72,7 +72,7 @@
containername = "Emitter crate" containername = "Emitter crate"
access = access_ce access = access_ce
/datum/supply_packs/engine/eng/field_gen /datum/supply_packs/eng/engine/field_gen
name = "Field Generator crate" name = "Field Generator crate"
contains = list(/obj/machinery/field_generator = 2) contains = list(/obj/machinery/field_generator = 2)
containertype = /obj/structure/closet/crate/secure containertype = /obj/structure/closet/crate/secure

View File

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

View File

@@ -70,28 +70,3 @@
cost = 10 cost = 10
containertype = "/obj/structure/closet/crate" containertype = "/obj/structure/closet/crate"
containername = "Webbing 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"

View File

@@ -11,7 +11,7 @@
group = "Robotics" group = "Robotics"
access = access_robotics access = access_robotics
/datum/supply_packs/eng/robotics /datum/supply_packs/robotics/robotics_assembly
name = "Robotics assembly crate" name = "Robotics assembly crate"
contains = list( contains = list(
/obj/item/device/assembly/prox_sensor = 3, /obj/item/device/assembly/prox_sensor = 3,

View File

@@ -21,12 +21,15 @@
containername = "coolant tank crate" containername = "coolant tank crate"
/datum/supply_packs/sci/phoron /datum/supply_packs/sci/phoron
name = "Phoron assembly crate" name = "Phoron research crate"
contains = list( contains = list(
/obj/item/weapon/tank/phoron = 3, /obj/item/weapon/tank/phoron = 3,
/obj/item/weapon/tank/oxygen = 3,
/obj/item/device/assembly/igniter = 3, /obj/item/device/assembly/igniter = 3,
/obj/item/device/assembly/prox_sensor = 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 cost = 10
containertype = /obj/structure/closet/crate/secure/phoron containertype = /obj/structure/closet/crate/secure/phoron

View File

@@ -251,8 +251,8 @@
/obj/item/clothing/suit/storage/vest/warden, /obj/item/clothing/suit/storage/vest/warden,
/obj/item/clothing/under/rank/warden, /obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/warden/corp, /obj/item/clothing/under/rank/warden/corp,
/obj/item/clothing/suit/armor/vest/warden, /obj/item/clothing/suit/storage/vest/wardencoat,
/obj/item/clothing/suit/armor/vest/warden/alt, /obj/item/clothing/suit/storage/vest/wardencoat/alt,
/obj/item/clothing/head/helmet/warden, /obj/item/clothing/head/helmet/warden,
/obj/item/weapon/cartridge/security, /obj/item/weapon/cartridge/security,
/obj/item/device/radio/headset/headset_sec, /obj/item/device/radio/headset/headset_sec,
@@ -279,7 +279,7 @@
/obj/item/clothing/head/helmet/HoS, /obj/item/clothing/head/helmet/HoS,
/obj/item/clothing/suit/storage/vest/hos, /obj/item/clothing/suit/storage/vest/hos,
/obj/item/clothing/under/rank/head_of_security/corp, /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/clothing/head/helmet/HoS/dermal,
/obj/item/weapon/cartridge/hos, /obj/item/weapon/cartridge/hos,
/obj/item/device/radio/headset/heads/hos, /obj/item/device/radio/headset/heads/hos,
@@ -309,7 +309,6 @@
/obj/item/clothing/under/rank/security2 = 4, /obj/item/clothing/under/rank/security2 = 4,
/obj/item/clothing/under/rank/warden, /obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/head_of_security, /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/head/soft/sec = 4,
/obj/item/clothing/gloves/black = 4, /obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge /obj/item/weapon/storage/box/holobadge

View File

@@ -50,12 +50,19 @@
containertype = /obj/structure/closet/crate containertype = /obj/structure/closet/crate
containername = "Janitorial supplies" containername = "Janitorial supplies"
/datum/supply_packs/supply/boxes /datum/supply_packs/supply/shipping
name = "Empty boxes" name = "Shipping supplies"
contains = list(/obj/item/weapon/storage/box = 10) 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 cost = 10
containertype = "/obj/structure/closet/crate" containertype = "/obj/structure/closet/crate"
containername = "Empty box crate" containername = "Shipping supplies crate"
/datum/supply_packs/supply/bureaucracy /datum/supply_packs/supply/bureaucracy
contains = list( contains = list(

View File

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

View File

@@ -2,8 +2,9 @@
* Ammunition * * Ammunition *
*************/ *************/
/datum/uplink_item/item/ammo /datum/uplink_item/item/ammo
item_cost = 2 item_cost = 20
category = /datum/uplink_category/ammunition category = /datum/uplink_category/ammunition
blacklisted = 1
/datum/uplink_item/item/ammo/a357 /datum/uplink_item/item/ammo/a357
name = ".357 Speedloader" name = ".357 Speedloader"
@@ -24,11 +25,12 @@
/datum/uplink_item/item/ammo/tommydrum /datum/uplink_item/item/ammo/tommydrum
name = "Tommygun Drum Magazine (.45)" name = "Tommygun Drum Magazine (.45)"
path = /obj/item/ammo_magazine/tommydrum 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 /datum/uplink_item/item/ammo/darts
name = "Darts" name = "Darts"
path = /obj/item/ammo_magazine/chemdart path = /obj/item/ammo_magazine/chemdart
item_cost = 5
/datum/uplink_item/item/ammo/sniperammo /datum/uplink_item/item/ammo/sniperammo
name = "Anti-Materiel Rifle ammo box (14.5mm)" name = "Anti-Materiel Rifle ammo box (14.5mm)"
@@ -41,7 +43,7 @@
/datum/uplink_item/item/ammo/a556/ap /datum/uplink_item/item/ammo/a556/ap
name = "10rnd Rifle Magazine (5.56mm AP)" name = "10rnd Rifle Magazine (5.56mm AP)"
path = /obj/item/ammo_magazine/a556/ap path = /obj/item/ammo_magazine/a556/ap
/*
/datum/uplink_item/item/ammo/a556m /datum/uplink_item/item/ammo/a556m
name = "20rnd Rifle Magazine (5.56mm)" name = "20rnd Rifle Magazine (5.56mm)"
path = /obj/item/ammo_magazine/a556m path = /obj/item/ammo_magazine/a556m
@@ -51,7 +53,7 @@
name = "20rnd Rifle Magazine (5.56mm AP)" name = "20rnd Rifle Magazine (5.56mm AP)"
path = /obj/item/ammo_magazine/a556m/ap path = /obj/item/ammo_magazine/a556m/ap
item_cost = 4 item_cost = 4
*/
/datum/uplink_item/item/ammo/c762 /datum/uplink_item/item/ammo/c762
name = "20rnd Rifle Magazine (7.62mm)" name = "20rnd Rifle Magazine (7.62mm)"
path = /obj/item/ammo_magazine/c762 path = /obj/item/ammo_magazine/c762
@@ -63,7 +65,7 @@
/datum/uplink_item/item/ammo/s762 /datum/uplink_item/item/ammo/s762
name = "10rnd Rifle Magazine (7.62mm)" name = "10rnd Rifle Magazine (7.62mm)"
path = /obj/item/ammo_magazine/s762 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 /datum/uplink_item/item/ammo/s762/ap
name = "10rnd Rifle Magazine (7.62mm AP)" name = "10rnd Rifle Magazine (7.62mm AP)"
@@ -88,7 +90,7 @@
/datum/uplink_item/item/ammo/g12/beanbag /datum/uplink_item/item/ammo/g12/beanbag
name = "12g Auto-Shotgun Magazine (Beanbag)" name = "12g Auto-Shotgun Magazine (Beanbag)"
path = /obj/item/ammo_magazine/g12/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 /datum/uplink_item/item/ammo/g12/pellet
name = "12g Auto-Shotgun Magazine (Pellet)" name = "12g Auto-Shotgun Magazine (Pellet)"
@@ -97,7 +99,9 @@
/datum/uplink_item/item/ammo/g12/stun /datum/uplink_item/item/ammo/g12/stun
name = "12g Auto-Shotgun Magazine (Stun)" name = "12g Auto-Shotgun Magazine (Stun)"
path = /obj/item/weapon/storage/box/stunshells path = /obj/item/weapon/storage/box/stunshells
item_cost = 10 // Discount due to it being LTL.
/datum/uplink_item/item/ammo/g12/flash /datum/uplink_item/item/ammo/g12/flash
name = "12g Auto-Shotgun Magazine (Flash)" name = "12g Auto-Shotgun Magazine (Flash)"
path = /obj/item/weapon/storage/box/flashshells path = /obj/item/weapon/storage/box/flashshells
item_cost = 10 // Discount due to it being LTL.

View File

@@ -3,6 +3,7 @@
*****************/ *****************/
/datum/uplink_item/abstract/announcements /datum/uplink_item/abstract/announcements
category = /datum/uplink_category/services category = /datum/uplink_category/services
blacklisted = 1
/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user) /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) log_and_message_admins("has triggered a falsified [src]", user)
/datum/uplink_item/abstract/announcements/fake_centcom /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() /datum/uplink_item/abstract/announcements/fake_centcom/New()
..() ..()
@@ -33,7 +34,7 @@
/datum/uplink_item/abstract/announcements/fake_crew_arrival /datum/uplink_item/abstract/announcements/fake_crew_arrival
name = "Crew Arrival Announcement/Records" 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!" 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) /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) if(!user)
@@ -91,7 +92,7 @@
/datum/uplink_item/abstract/announcements/fake_ion_storm /datum/uplink_item/abstract/announcements/fake_ion_storm
name = "Ion Storm Announcement" name = "Ion Storm Announcement"
desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." 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) /datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc)
ion_storm_announcement() ion_storm_announcement()
@@ -100,7 +101,7 @@
/datum/uplink_item/abstract/announcements/fake_radiation /datum/uplink_item/abstract/announcements/fake_radiation
name = "Radiation Storm Announcement" name = "Radiation Storm Announcement"
desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." 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) /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) var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0)

View File

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

View File

@@ -19,6 +19,7 @@
/datum/uplink_item/item/badassery/random_one /datum/uplink_item/item/badassery/random_one
name = "Random Item" name = "Random Item"
desc = "Buys you one 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) /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) var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
@@ -53,17 +54,32 @@
****************/ ****************/
/datum/uplink_item/item/badassery/surplus /datum/uplink_item/item/badassery/surplus
name = "Surplus Crate" name = "Surplus Crate"
item_cost = 40 item_cost = DEFAULT_TELECRYSTAL_AMOUNT
var/item_worth = 60 var/item_worth = 240
var/icon 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() /datum/uplink_item/item/badassery/surplus/New()
..() ..()
desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers." 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) /datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc)
var/obj/structure/largecrate/C = new(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) for(var/datum/uplink_item/I in random_items)
I.purchase_log(U) I.purchase_log(U)
I.get_goods(U, C) I.get_goods(U, C)

View File

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

View File

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

View File

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

View File

@@ -4,33 +4,37 @@
/datum/uplink_item/item/medical /datum/uplink_item/item/medical
category = /datum/uplink_category/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 /datum/uplink_item/item/medical/sinpockets
name = "Box of Sin-Pockets" name = "Box of Sin-Pockets"
item_cost = 1 item_cost = 5
path = /obj/item/weapon/storage/box/sinpockets 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 /datum/uplink_item/item/medical/ambrosiaseeds
name = "Box of 7x ambrosia seed packets" name = "Box of 7x ambrosia seed packets"
item_cost = 1 item_cost = 5
path = /obj/item/weapon/storage/box/ambrosia path = /obj/item/weapon/storage/box/ambrosia
/datum/uplink_item/item/medical/ambrosiadeusseeds /datum/uplink_item/item/medical/ambrosiadeusseeds
name = "Box of 7x ambrosia deus seed packets" name = "Box of 7x ambrosia deus seed packets"
item_cost = 2 item_cost = 10
path = /obj/item/weapon/storage/box/ambrosiadeus path = /obj/item/weapon/storage/box/ambrosiadeus
/datum/uplink_item/item/medical/freezer
name = "Portable Freezer"
item_cost = 10
path = /obj/item/weapon/storage/box/freezer
/datum/uplink_item/item/medical/surgery
name = "Surgery kit"
item_cost = 45
path = /obj/item/weapon/storage/firstaid/surgery
/datum/uplink_item/item/medical/combat
name = "Combat medical kit"
item_cost = 60
path = /obj/item/weapon/storage/firstaid/combat

View File

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

View File

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

View File

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

View File

@@ -4,82 +4,112 @@
/datum/uplink_item/item/tools /datum/uplink_item/item/tools
category = /datum/uplink_category/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 /datum/uplink_item/item/tools/toolbox
name = "Fully Loaded Toolbox" name = "Fully Loaded Toolbox"
item_cost = 1 item_cost = 10
path = /obj/item/weapon/storage/toolbox/syndicate 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 /datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit" name = "Morphic Clerical Kit"
item_cost = 3 item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/clerical path = /obj/item/weapon/storage/box/syndie_kit/clerical
/datum/uplink_item/item/tools/space_suit /datum/uplink_item/item/tools/encryptionkey_radio
name = "Space Suit" name = "Encrypted Radio Channel Key"
item_cost = 3 item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/space path = /obj/item/device/encryptionkey/syndicate
/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/money /datum/uplink_item/item/tools/money
name = "Operations Funding" name = "Operations Funding"
item_cost = 3 item_cost = 10
path = /obj/item/weapon/storage/secure/briefcase/money path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/crystal /datum/uplink_item/item/tools/plastique
name = "Tradable Crystal" name = "C-4 (Destroys walls)"
item_cost = 1 item_cost = 10
path = /obj/item/device/telecrystal path = /obj/item/weapon/plastique
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/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 /datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool" name = "Door Hacking Tool"
item_cost = 2 item_cost = 20
path = /obj/item/device/multitool/hacktool path = /obj/item/device/multitool/hacktool
desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ 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. \ 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." 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

View File

@@ -47,3 +47,6 @@ datum/uplink_category/ammunition
/datum/uplink_category/visible_weapons /datum/uplink_category/visible_weapons
name = "Highly Visible and Dangerous Weapons" name = "Highly Visible and Dangerous Weapons"
/datum/uplink_category/telecrystals
name = "Telecrystals"

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,9 @@
Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so
the HUD updates properly! */ 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. //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) proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt)
if(!can_process_hud(M)) 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. //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. mob/proc/handle_regular_hud_updates() //Used in the life.dm of mobs that can use HUDs.
if(client) if(client)
for(var/image/hud in client.images) for(var/image/hud_overlay/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud")
client.images -= hud client.images -= hud
med_hud_users -= src med_hud_users -= src
sec_hud_users -= src sec_hud_users -= src

View File

@@ -104,6 +104,9 @@
if(ghosts_only && !istype(player.current, /mob/observer/dead)) if(ghosts_only && !istype(player.current, /mob/observer/dead))
candidates -= player 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.") 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) else if(player.special_role)
candidates -= player 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.") 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.")

View 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>"

View File

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

View File

@@ -351,6 +351,14 @@ area/space/atmosalert()
name = "\improper Administration Shuttle" name = "\improper Administration Shuttle"
icon_state = "shuttlered2" 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 /area/shuttle/thunderdome
name = "honk" name = "honk"

View File

@@ -230,6 +230,11 @@ its easier to just keep the beam vertical.
/atom/proc/melt() /atom/proc/melt()
return 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) /atom/proc/hitby(atom/movable/AM as mob|obj)
if (density) if (density)
AM.throwing = 0 AM.throwing = 0

View File

@@ -79,6 +79,16 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(lesser_form && !P.allowduringlesserform) continue if(lesser_form && !P.allowduringlesserform) continue
if(!(P in src.verbs)) if(!(P in src.verbs))
src.verbs += P.verbpath 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) for(var/language in languages)
mind.changeling.absorbed_languages |= language 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) for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
if(P.isVerb) if(P.isVerb)
verbs -= P.verbpath 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 //Helper proc. Does all the checks and stuff for us to avoid copypasta

View File

@@ -12,6 +12,8 @@ var/list/datum/power/changeling/powerinstances = list()
var/enhancedtext = "" var/enhancedtext = ""
var/isVerb = 1 // Is it an active power, or passive? var/isVerb = 1 // Is it an active power, or passive?
var/verbpath // Path to a verb that contains the effects. 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 /datum/power/changeling
var/allowduringlesserform = 0 var/allowduringlesserform = 0
@@ -340,6 +342,17 @@ var/list/datum/power/changeling/powerinstances = list()
if(Thepower.genomecost > 0) if(Thepower.genomecost > 0)
purchased_powers_history.Add("[Pname] ([Thepower.genomecost] points)") 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) if(!Thepower.isVerb && Thepower.verbpath)
call(M.current, Thepower.verbpath)() call(M.current, Thepower.verbpath)()
else if(remake_verbs) else if(remake_verbs)

View File

@@ -1,6 +1,7 @@
/datum/power/changeling/absorb_dna /datum/power/changeling/absorb_dna
name = "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." 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 genomecost = 0
verbpath = /mob/proc/changeling_absorb_dna verbpath = /mob/proc/changeling_absorb_dna

View File

@@ -3,6 +3,7 @@
desc = "We reform one of our arms into a deadly blade." desc = "We reform one of our arms into a deadly blade."
helptext = "We may retract our armblade by dropping it. It can deflect projectiles." helptext = "We may retract our armblade by dropping it. It can deflect projectiles."
enhancedtext = "The blade will have armor peneratration." enhancedtext = "The blade will have armor peneratration."
ability_icon_state = "ling_armblade"
genomecost = 2 genomecost = 2
verbpath = /mob/proc/changeling_arm_blade 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." 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 = 'icons/obj/weapons.dmi'
icon_state = "arm_blade" icon_state = "arm_blade"
item_state = "arm_blade"
w_class = 5.0 w_class = 5.0
force = 40 force = 40
sharp = 1 sharp = 1
edge = 1 edge = 1
pry = 1
anchored = 1 anchored = 1
throwforce = 0 //Just to be on the safe side throwforce = 0 //Just to be on the safe side
throw_range = 0 throw_range = 0

View File

@@ -2,13 +2,13 @@
name = "Organic Space Suit" name = "Organic Space Suit"
desc = "We grow an organic suit to protect ourselves from space exposure." desc = "We grow an organic suit to protect ourselves from space exposure."
helptext = "To remove the suit, use the ability again." helptext = "To remove the suit, use the ability again."
ability_icon_state = "lingspacesuit"
genomecost = 1 genomecost = 1
verbpath = /mob/proc/changeling_spacesuit verbpath = /mob/proc/changeling_spacesuit
/mob/proc/changeling_spacesuit() /mob/proc/changeling_spacesuit()
set category = "Changeling" set category = "Changeling"
set name = "Organic Space Suit (20)" set name = "Organic Space Suit (20)"
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling)) if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling))
return 1 return 1
return 0 return 0
@@ -17,6 +17,7 @@
name = "Chitinous Spacearmor" name = "Chitinous Spacearmor"
desc = "We turn our skin into tough chitin to protect us from damage and space exposure." 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." helptext = "To remove the armor, use the ability again."
ability_icon_state = "lingarmor"
genomecost = 3 genomecost = 3
verbpath = /mob/proc/changeling_spacearmor verbpath = /mob/proc/changeling_spacearmor
@@ -33,7 +34,6 @@
/obj/item/clothing/suit/space/changeling /obj/item/clothing/suit/space/changeling
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacesuit" icon_state = "lingspacesuit"
item_state = "lingspacehelmet"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." 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, 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) //it still ends up in your blood. (also balance but muh fluff)
@@ -54,7 +54,6 @@
/obj/item/clothing/head/helmet/space/changeling /obj/item/clothing/head/helmet/space/changeling
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacehelmet" icon_state = "lingspacehelmet"
item_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL. flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL.
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -70,7 +69,6 @@
name = "chitinous mass" name = "chitinous mass"
desc = "A tough, hard covering of black chitin." desc = "A tough, hard covering of black chitin."
icon_state = "lingarmor" icon_state = "lingarmor"
item_state = "lingarmor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS 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. 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 siemens_coefficient = 0.3
@@ -91,7 +89,6 @@
name = "chitinous mass" name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front." desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet" icon_state = "lingarmorhelmet"
item_state = "lingarmorhelmet"
armor = list(melee = 75, bullet = 60, laser = 60,energy = 60, bomb = 60, bio = 0, rad = 0) armor = list(melee = 75, bullet = 60, laser = 60,energy = 60, bomb = 60, bio = 0, rad = 0)
siemens_coefficient = 0.3 siemens_coefficient = 0.3
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE

View File

@@ -4,6 +4,7 @@
name = "Augmented Eyesight" name = "Augmented Eyesight"
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability." 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." 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 genomecost = 2
var/active = 0 //Whether or not vision is enhanced var/active = 0 //Whether or not vision is enhanced
verbpath = /mob/proc/changeling_augmented_eyesight verbpath = /mob/proc/changeling_augmented_eyesight

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
name = "Digital Camoflauge" name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras." 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." 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 genomecost = 1
allowduringlesserform = 1 allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo verbpath = /mob/proc/changeling_digitalcamo

View File

@@ -3,6 +3,7 @@
desc = "We discreetly evolve a finger to be able to send a small electric charge. \ 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." 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." 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 genomecost = 3
verbpath = /mob/proc/changeling_electric_lockpick verbpath = /mob/proc/changeling_electric_lockpick

View File

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

View File

@@ -3,6 +3,7 @@
desc = "We evolve additional sacs of adrenaline throughout our body." 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." 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." enhancedtext = "Constant recovery from stuns for thirty seconds."
ability_icon_state = "ling_epinepherine_overdose"
genomecost = 2 genomecost = 2
verbpath = /mob/proc/changeling_epinephrine_overdose verbpath = /mob/proc/changeling_epinephrine_overdose

View File

@@ -2,6 +2,7 @@
name = "Extract DNA" name = "Extract DNA"
desc = "We stealthily sting a target and extract the DNA from them." 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." 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 genomecost = 0
allowduringlesserform = 1 allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting verbpath = /mob/proc/changeling_extract_dna_sting

View File

@@ -17,6 +17,7 @@ var/global/list/changeling_fabricated_clothing = list(
We cannot be relieved of this clothing by others." 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. \ 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." To remove our new fabricated clothing, use this ability again."
ability_icon_state = "ling_fabricate_clothing"
genomecost = 2 genomecost = 2
verbpath = /mob/proc/changeling_fabricate_clothing verbpath = /mob/proc/changeling_fabricate_clothing
@@ -32,6 +33,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/under/chameleon/changeling /obj/item/clothing/under/chameleon/changeling
name = "malformed flesh" name = "malformed flesh"
icon_state = "lingchameleon" 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" item_state = "lingchameleon"
worn_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 \ 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 /obj/item/clothing/suit/chameleon/changeling
name = "chitinous chest" name = "chitinous chest"
icon_state = "lingchameleon" 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" item_state = "armor"
desc = "The cells in our chest are rapidly shifting, ready to reform into material that can resemble most pieces of clothing." desc = "The cells in our chest are rapidly shifting, ready to reform into material that can resemble most pieces of clothing."
origin_tech = list() origin_tech = list()
@@ -100,6 +109,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/shoes/chameleon/changeling /obj/item/clothing/shoes/chameleon/changeling
name = "malformed feet" name = "malformed feet"
icon_state = "lingchameleon" 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" 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." 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() origin_tech = list()
@@ -122,6 +135,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/weapon/storage/backpack/chameleon/changeling /obj/item/weapon/storage/backpack/chameleon/changeling
name = "backpack" name = "backpack"
icon_state = "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" 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." 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() origin_tech = list()
@@ -146,6 +163,10 @@ var/global/list/changeling_fabricated_clothing = list(
/obj/item/clothing/gloves/chameleon/changeling /obj/item/clothing/gloves/chameleon/changeling
name = "malformed hands" name = "malformed hands"
icon_state = "lingchameleon" 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" 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 \ 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." 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 /obj/item/clothing/mask/chameleon/changeling
name = "chitin visor" name = "chitin visor"
icon_state = "lingchameleon" 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" 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 \ 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.." tanks.."
@@ -216,6 +241,10 @@ var/global/list/changeling_fabricated_clothing = list(
name = "waist pouch" name = "waist pouch"
desc = "We can store objects in this, as well as shift it's appearance, so that it resembles various common belts." desc = "We can store objects in this, as well as shift it's appearance, so that it resembles various common belts."
icon_state = "lingchameleon" 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" item_state = "utility"
origin_tech = list() origin_tech = list()
canremove = 0 canremove = 0

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
name = "Mimic Voice" name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired 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" 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 genomecost = 1
verbpath = /mob/proc/changeling_mimicvoice verbpath = /mob/proc/changeling_mimicvoice

View File

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

View File

@@ -4,6 +4,7 @@
helptext = "This will heal a significant amount of brute, fire, oxy, clone, and brain damage, and heal broken bones, internal bleeding, low blood, \ 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." 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." enhancedtext = "Healing increased to heal up to maximum health."
ability_icon_state = "ling_rapid_regeneration"
genomecost = 2 genomecost = 2
verbpath = /mob/proc/changeling_rapid_regen verbpath = /mob/proc/changeling_rapid_regen

View File

@@ -2,6 +2,7 @@
name = "Recursive Enhancement" name = "Recursive Enhancement"
desc = "We cause our next ability use to have increased or additional effects." 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." 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 genomecost = 3
verbpath = /mob/proc/changeling_recursive_enhancement verbpath = /mob/proc/changeling_recursive_enhancement

View File

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

View File

@@ -2,15 +2,30 @@
name = "Self Respiration" name = "Self Respiration"
desc = "We evolve our body to no longer require drawing oxygen from the atmosphere." 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." helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones."
ability_icon_state = "ling_toggle_breath"
genomecost = 0 genomecost = 0
isVerb = 0
verbpath = /mob/proc/changeling_self_respiration verbpath = /mob/proc/changeling_self_respiration
//No breathing required //No breathing required
/mob/proc/changeling_self_respiration() /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)) if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src 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 C.does_not_breathe = 1
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>" src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
return 1 return 1
else
C.does_not_breathe = 0
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
return 0 return 0

View File

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

View File

@@ -3,6 +3,7 @@
desc = "We silently sting a human, completely silencing them for a short time." 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." 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." enhancedtext = "Silence duration is extended."
ability_icon_state = "ling_sting_mute"
genomecost = 2 genomecost = 2
allowduringlesserform = 1 allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting verbpath = /mob/proc/changeling_silence_sting

View File

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

View File

@@ -3,6 +3,7 @@
name = "Transformation Sting" name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another." 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." 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 genomecost = 3
verbpath = /mob/proc/changeling_transformation_sting verbpath = /mob/proc/changeling_transformation_sting

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
/datum/game_mode/conflux /datum/game_mode/conflux
name = "Wizard & Cult" name = "Technomancer & Cult"
round_description = "A space wizard and a cult have invaded the station!" round_description = "A space wizard and a cult have invaded the station!"
extended_round_description = "Cultists and wizards spawn during this round." extended_round_description = "Cultists and wizards spawn during this round."
config_tag = "conflux" config_tag = "conflux"
@@ -7,6 +7,6 @@
required_players_secret = 15 required_players_secret = 15
required_enemies = 5 required_enemies = 5
end_on_antag_death = 1 end_on_antag_death = 1
antag_tags = list(MODE_WIZARD, MODE_CULTIST) antag_tags = list(MODE_TECHNOMANCER, MODE_CULTIST)
require_all_templates = 1 require_all_templates = 1
votable = 0 votable = 0

View File

@@ -1,5 +1,5 @@
/datum/game_mode/lizard /datum/game_mode/lizard
name = "Wizard & Changelings" name = "Technomancer & Changelings"
round_description = "A space wizard and changelings have invaded the station!" round_description = "A space wizard and changelings have invaded the station!"
extended_round_description = "Changelings and a wizard spawn during this round." extended_round_description = "Changelings and a wizard spawn during this round."
config_tag = "lizard" config_tag = "lizard"
@@ -7,5 +7,6 @@
required_players_secret = 8 required_players_secret = 8
required_enemies = 3 required_enemies = 3
end_on_antag_death = 0 end_on_antag_death = 0
antag_tags = list(MODE_WIZARD, MODE_CHANGELING) antag_tags = list(MODE_TECHNOMANCER, MODE_CHANGELING)
require_all_templates = 1 require_all_templates = 1
votable = 0

View File

@@ -1,5 +1,5 @@
/datum/game_mode/mercwiz /datum/game_mode/mercwiz
name = "Mercenaries & Wizard" name = "Mercenaries & Technomancer"
round_description = "A mercenary team and a wizard have invaded the station!" round_description = "A mercenary team and a wizard have invaded the station!"
extended_round_description = "Mercenaries and wizard spawn during this round." extended_round_description = "Mercenaries and wizard spawn during this round."
config_tag = "mercwiz" 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_players_secret = 15 //I don't think we can have it lower and not need an ERT every round.
required_enemies = 7 required_enemies = 7
end_on_antag_death = 0 end_on_antag_death = 0
antag_tags = list(MODE_MERCENARY, MODE_WIZARD) antag_tags = list(MODE_MERCENARY, MODE_TECHNOMANCER)
require_all_templates = 1 require_all_templates = 1
votable = 0

View File

@@ -1,5 +1,5 @@
/datum/game_mode/visitors /datum/game_mode/visitors
name = "Wizard & Ninja" name = "Technomancer & Ninja"
round_description = "A space wizard and a ninja have invaded the station!" round_description = "A space wizard and a ninja have invaded the station!"
extended_round_description = "A ninja and wizard spawn during this round." extended_round_description = "A ninja and wizard spawn during this round."
config_tag = "visitors" config_tag = "visitors"
@@ -7,5 +7,6 @@
required_players_secret = 8 required_players_secret = 8
required_enemies = 2 required_enemies = 2
end_on_antag_death = 0 end_on_antag_death = 0
antag_tags = list(MODE_WIZARD, MODE_NINJA) antag_tags = list(MODE_TECHNOMANCER, MODE_NINJA)
require_all_templates = 1 require_all_templates = 1
votable = 0

View 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
*/

View 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

View 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)

View 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"

View 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) )

View 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

View File

@@ -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