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

# Conflicts:
#	html/changelogs/.all_changelog.yml
#	icons/mob/hud.dmi
#	maps/polaris-1.dmm

Fake conflicts from a merge error previously. No real conflicts.
This commit is contained in:
Arokha Sieyes
2016-11-04 15:42:32 -04:00
120 changed files with 1138 additions and 638 deletions
+2 -1
View File
@@ -110,7 +110,8 @@
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
#define MOB_LARGE 40
#define MOB_HUGE 40
#define MOB_LARGE 30
#define MOB_MEDIUM 20
#define MOB_SMALL 10
#define MOB_TINY 5
+9
View File
@@ -0,0 +1,9 @@
/proc/create_objects_in_loc(var/atom/loc, var/list/item_paths)
if(!istype(loc))
CRASH("Inappropriate loction given.")
if(!istype(item_paths))
CRASH("Inappropriate item path list given.")
for(var/item_path in item_paths)
for(var/i = 1 to max(1, item_paths[item_path]))
new item_path(loc)
+13 -1
View File
@@ -97,7 +97,8 @@
var/i = 1
for(var/obj/screen/ability/ability in ability_objects)
ability.update_icon(forced)
ability.maptext = "[i]" // Slot number
ability.index = i
ability.maptext = "[ability.index]" // Slot number
i++
/obj/screen/movable/ability_master/update_icon()
@@ -195,6 +196,7 @@
maptext_x = 3
var/background_base_state = "grey"
var/ability_icon_state = null
var/index = 0
// var/spell/spell = null
var/obj/screen/movable/ability_master/ability_master
@@ -260,6 +262,16 @@
// spell.perform(usr)
activate()
/obj/screen/ability/MouseDrop(var/atom/A)
if(!A || A == src)
return
if(istype(A, /obj/screen/ability))
var/obj/screen/ability/ability = A
if(ability.ability_master && ability.ability_master == src.ability_master)
ability_master.ability_objects.Swap(src.index, ability.index)
ability_master.toggle_open(2) // To update the UI.
// 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."
+2 -2
View File
@@ -56,7 +56,7 @@
contains = list(
/obj/item/clothing/suit/pirate,
/obj/item/clothing/suit/judgerobe,
/obj/item/clothing/suit/wcoat,
/obj/item/clothing/accessory/wcoat,
/obj/item/clothing/suit/hastur,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/suit/nun,
@@ -102,7 +102,7 @@
/obj/item/clothing/under/lawyer/purpsuit,
/obj/item/clothing/shoes/black = 2,
/obj/item/clothing/shoes/leather,
/obj/item/clothing/suit/wcoat
/obj/item/clothing/accessory/wcoat
)
name = "Formalwear closet"
cost = 30
+6 -1
View File
@@ -57,4 +57,9 @@
/datum/category_item/underwear/bottom/fishnet_lower
name = "Fishnets"
icon_state = "fishnet_lower"
icon_state = "fishnet_lower"
/datum/category_item/underwear/bottom/striped_panties
name = "Striped Panties"
icon_state = "striped_panties"
has_color = TRUE
+6 -1
View File
@@ -57,4 +57,9 @@
/datum/category_item/underwear/top/fishnet_gloves
name = "Fishnet with gloves"
icon_state = "fishnet_gloves"
icon_state = "fishnet_gloves"
/datum/category_item/underwear/top/striped_bra
name = "Striped Bra"
icon_state = "striped_bra"
has_color = TRUE
@@ -81,3 +81,25 @@ var/datum/antagonist/technomancer/technomancers
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>"
/datum/antagonist/technomancer/print_player_summary()
..()
for(var/obj/item/weapon/technomancer_core/core in technomancer_belongings)
if(core.wearer)
continue // Only want abandoned cores.
if(!core.spells.len)
continue // Cores containing spells only.
world << "Abandoned [core] had [english_list(core.spells)].<br>"
/datum/antagonist/technomancer/print_player_full(var/datum/mind/player)
var/text = print_player_lite(player)
var/obj/item/weapon/technomancer_core/core
if(player.original)
core = locate() in player.original
if(core)
text += "<br>Bought [english_list(core.spells)], and used \a [core]."
else
text += "<br>They've lost their core."
return text
+111 -9
View File
@@ -12,7 +12,6 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
/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
@@ -20,6 +19,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
/datum/technomancer/spell
var/category = ALL_SPELLS
var/enhancement_desc = null
var/spell_power_desc = null
/obj/item/weapon/technomancer_catalog
name = "catalog"
@@ -28,6 +29,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
icon = 'icons/obj/storage.dmi'
icon_state ="scientology" //placeholder
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
var/budget = 1000
var/max_budget = 1000
var/mob/living/carbon/human/owner = null
@@ -35,7 +37,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
var/list/equipment_instances = list()
var/list/consumable_instances = list()
var/list/assistance_instances = list()
var/tab = 0
var/tab = 4 // Info tab, so new players can read it before doing anything.
var/spell_tab = ALL_SPELLS
var/show_scepter_text = 0
@@ -116,7 +118,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</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>"
@@ -129,8 +132,10 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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.spell_power_desc)
dat += "<font color='purple'>Spell Power: [spell.spell_power_desc]</font><br>"
if(spell.enhancement_desc)
dat += "<font color='blue'>Scepter Effect: [spell.enhancement_desc]</font><br>"
if(spell.cost <= budget)
dat += "<a href='byond://?src=\ref[src];spell_choice=[spell.name]'>Purchase</a> ([spell.cost])<br><br>"
else
@@ -143,7 +148,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</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>"
@@ -160,7 +166,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</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>"
@@ -177,7 +184,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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></align><br>"
dat += "<b>Assistance</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</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>"
@@ -188,6 +196,72 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
user << browse(dat, "window=radio")
onclose(user, "radio")
if(4) //Info
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>Info</b></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
dat += "<br>"
dat += "<h1>Manipulation Core Owner's Manual</h1><br>"
dat += "This brief entry in your catelog will try to explain what everything does. For starters, the thing you're \
probably wearing on your back is known as a <b>Manipulation Core</b>, or just a 'Core'. It allows you to do amazing \
things with almost no effort, depending on what <b>functions</b> you've purchased for it. Don't lose your core!<br>"
dat += "<br>"
dat += "There are a few things you need to keep in mind as you use your Core to manipulate the universe. The core \
requires a special type of <b>energy</b>, that is referred to as just 'Energy' in the catelog. All cores generate \
their own energy, some more than others. Most functions require energy be spent in order to work, so make sure not \
to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \
do something to generate energy.<br>"
dat += "<br>"
dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \
of <b>Instability</b>. Instability is the result of your Core's energy being used to fuel it, and so little is \
understood about it, even among fellow Core owners, however it is almost always a bad thing to have. Instability will \
'cling' to you as you use functions, with powerful functions creating lots of instability. The effects of holding onto \
instability are generally harmless or mildly annoying at low levels, with effects such as sparks in the air or forced \
blinking. Accumulating more and more instability will lead to worse things happening, which can easily be fatal, if not \
managed properly.<br>"
dat += "<br>"
dat += "Fortunately, all Cores come with a meter to tell you how much instability you currently hold. \
Instability will go away on its own as time goes on. You can tell if you have instability by the characteristic \
purple colored lightning that appears around something with instability lingering on it. High amounts of instability \
may cause the object afflicted with it to glow a dark purple, which is often known simply as <b>Glow</b>, which spreads \
the instability. You should stay far away from anyone afflicted by Glow, as they will be a danger to both themselves and \
anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not seperated.<br>"
dat += "<br>"
dat += "You should strive to keep you and your apprentices' cores secure. To help with this, each core comes with a \
locking mechanism, which should make attempts at forceful removal by third parties (or you) futile, until it is \
unlocked again. Do note that there is a safety mechanism, which will automatically unlock the core if the wearer \
suffers death. There exists a secondary safety mechanism (safety for the core, not you) that is triggered when \
the core detects itself being carried, with the carrier not being authorized. It will respond by giving a \
massive amount of Instability to them, so be careful, or perhaps make use of that.<br>"
dat += "<br>"
dat += "<b>You can refund functions, equipment items, and assistance items, so long as you are in your base.</b> \
Once you leave, you can't refund anything, however you can still buy things if you still have points remaining. \
To refund functions, just click the 'Refund Functions' button on the top, when in the functions tabs. \
For equipment items, you need to hit it against the catelog.<br>"
dat += "<br>"
dat += "Your blue robes and hat are both stylish, and somewhat protective against hostile energies, which includes \
EXTERNAL instability sources (like Glow), and mundane electricity. If you're looking for protection against other \
things, it's suggested you purchase or otherwise obtain armor.<br>"
dat += "<br>"
dat += "There are a few terms you may not understand in the catelog, so this will try to explain them.<br>"
dat += "A function can be thought of as a 'spell', that you use by holding in your hands and trying to use it on \
a target of your choice.<br>"
dat += "Some functions can have their abilities enhanced by a special rod called the Scepter of Enhancement. \
If a function is able to be boosted with it, it will be shown underneath the description of the function as \
<font color='blue'><i>'Scepter Effect:'</i></font>. Note that you must hold the scepter for it to work, so try to avoid losing it.<br>"
dat += "Functions can also be boosted with the core itself. A function that is able to benefit \
from this will have <font color='purple'><i>'Spell Power:'</i></font> underneath. Different Cores have different \
amounts of spell power.<br>"
dat += "When a function refers to 'allies', it means you, your apprentices, currently controlled entities (with the \
Control function), and friendly simple-minded entities that you've summoned with the Scepter of Enhancement.<br>"
dat += "A meter is equal to one 'tile'.<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.)
@@ -266,8 +340,36 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
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)
if(spell_datum.obj_path == spell.spellpath)
budget += spell_datum.cost
core.remove_spell(spell)
break
attack_self(H)
/obj/item/weapon/technomancer_catalog/attackby(var/atom/movable/AM, var/mob/user)
if(user.z != 2)
to_chat(user, "<span class='danger'>You can only refund at your base, it's too late now!</span>")
return
for(var/datum/technomancer/equipment/E in equipment_instances + assistance_instances)
if(AM.type == E.obj_path) // We got a match.
if(budget + E.cost > max_budget)
to_chat(user, "<span class='warning'>\The [src] will not allow you to overflow your maximum budget by refunding that.</span>")
return
else
budget = budget + E.cost
to_chat(user, "<span class='notice'>You've refunded \the [AM].</span>")
// We sadly need to do special stuff here or else people who refund cores with spells will lose points permanently.
if(istype(AM, /obj/item/weapon/technomancer_core))
var/obj/item/weapon/technomancer_core/core = AM
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)
budget += spell_datum.cost
to_chat(user, "<span class='notice'>[spell.name] was inside \the [core], and was refunded.</span>")
core.remove_spell(spell)
break
qdel(AM)
return
to_chat(user, "<span class='warn'>\The [src] is unable to refund \the [AM].</span>")
+44 -11
View File
@@ -20,7 +20,9 @@
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/instability_modifier = 0.8 // Multiplier on how much instability is added.
var/energy_cost_modifier = 1.0 // Multiplier on how much spells will cost.
var/spell_power_modifier = 1.0 // Multiplier on how strong spells are.
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",
@@ -67,6 +69,7 @@
return 0
/obj/item/weapon/technomancer_core/proc/pay_energy(amount)
amount = round(amount * energy_cost_modifier, 0.1)
if(amount <= energy)
energy = max(energy - amount, 0)
return 1
@@ -131,7 +134,6 @@
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)
@@ -222,7 +224,9 @@
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
instability_modifier = 1.2
energy_cost_modifier = 0.7
spell_power_modifier = 1.1
/obj/item/weapon/technomancer_core/unstable/regenerate()
var/instability_bonus = 0
@@ -243,19 +247,21 @@
max_energy = 7000
regen_rate = 70 //100 seconds to full
slowdown = -1
instability_modifer = 0.9
instability_modifier = 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 \
cumbersome and bulky, due to the additional energy capacitors installed, which allows for a massive energy storage, as well \
as stronger function usage. 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
instability_modifier = 1.0
spell_power_modifier = 1.4
// Using this can result in abilities costing less energy. If you're lucky.
/obj/item/weapon/technomancer_core/recycling
@@ -265,15 +271,17 @@
energy = 12000
max_energy = 12000
regen_rate = 40 //300 seconds to full
instability_modifer = 0.6
instability_modifier = 0.6
energy_cost_modifier = 0.8
/obj/item/weapon/technomancer_core/recycling/pay_energy(amount)
..()
if(.)
var/success = ..()
if(success)
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.
if(amount >= 50) // 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>"
return success
// For those dedicated to summoning hoards of things.
/obj/item/weapon/technomancer_core/summoner
@@ -285,12 +293,37 @@
max_energy = 8000
regen_rate = 35 //228 seconds to full
max_summons = 40
instability_modifer = 1.0
instability_modifier = 1.2
spell_power_modifier = 1.2
/obj/item/weapon/technomancer_core/summoner/pay_dues()
if(summoned_mobs.len)
pay_energy( round(summoned_mobs.len) )
// For those who hate instability.
/obj/item/weapon/technomancer_core/safety
name = "safety core"
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is designed to be \
the closest thing you can get to 'safe' for a Core. Instability from this is significantly reduced. You can even dance if \
you want to, and leave your apprentice behind."
energy = 7000
max_energy = 7000
regen_rate = 30 //233 seconds to full
instability_modifier = 0.3
spell_power_modifier = 0.7
// For those who want to blow everything on a few spells.
/obj/item/weapon/technomancer_core/overcharged
name = "overcharged core"
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type will use as much \
energy as it can in order to pump up the strength of functions used to insane levels."
energy = 15000
max_energy = 15000
regen_rate = 40 //375 seconds to full
instability_modifier = 1.1
spell_power_modifier = 1.75
energy_cost_modifier = 2.0
/obj/item/weapon/technomancer_core/verb/toggle_lock()
set name = "Toggle Core Lock"
set category = "Object"
+79 -16
View File
@@ -1,55 +1,106 @@
/datum/technomancer/equipment/default_core
name = "Manipulation Core"
// desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
// another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a \
// rate of 50 units. It also reduces incoming instability from functions by 20%."
desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a \
rate of 50 units. It also reduces incoming instability from functions by 20%."
another core, don't forget to refund the old core.<br>\
Capacity: 10k<br>\
Recharge: 50/s<br>\
Instability Modifier: 80%<br>\
Energy Cost Modifier: 100%<br>\
Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core
/datum/technomancer/equipment/rapid_core
name = "Rapid Core"
desc = "A core optimized for passive regeneration, however at the cost of capacity. Has a capacity of 7,000 units of energy, and \
recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster, and \
reduces incoming instability from functions by 10%."
recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster.<br>\
<font color='red'>Capacity: 7k</font><br>\
<font color='green'><b>Recharge: 70/s</b></font><br>\
<font color='red'>Instability Modifier: 90%</font><br>\
Energy Cost Modifier: 100%<br>\
Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/rapid
/datum/technomancer/equipment/bulky_core
name = "Bulky Core"
desc = "This core has very large capacitors, however it also has a subpar fractal reactor. The user is recommended to \
purchase one or more energy-generating Functions as well if using this core. Has a capacity of 20,000 units of energy, \
and recharges at a rate of 25 units. The intense weight of the core unfortunately can cause the wear to move slightly slower, \
and the closeness of the capacitors causes a slight increase in incoming instability by 10%."
purchase one or more energy-generating Functions as well if using this core. The intense weight of the core unfortunately can \
cause the wear to move slightly slower, and the closeness of the capacitors causes a slight increase in incoming instability.<br>\
<font color='green'><b>Capacity: 20k</b></font><br>\
<font color='red'>Recharge: 25/s</font><br>\
<font color='red'>Instability Modifier: 100%</font><br>\
Energy Cost Modifier: 100%<br>\
<font color='green'>Spell Power: 140%</font>"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/bulky
/datum/technomancer/equipment/unstable
name = "Unstable Core"
desc = "This core feeds off unstable energies around the user in addition to a fractal reactor. This means that it performs \
better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. Has a capacity of 13,000 \
units of energy, and recharges at a rate of 35 units at no instability, and approximately 110 units when within the \
'yellow zone' of instability. Incoming instability is also amplified by 30%, due to the nature of this core."
better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. The rate of recharging \
increases as the user accumulates more instability, eventually exceeding even the rapid core in regen speed, at a huge risk.<br>\
<font color='green'>Capacity: 13k</font><br>\
<font color='green'>Recharge: 35/s to 110/s+</font><br>\
<font color='red'><b>Instability Modifier: 130%</b></font><br>\
<font color='green'>Energy Cost Modifier: 70%</font><br>\
<font color='green'>Spell Power: 110%</font>"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/unstable
/datum/technomancer/equipment/recycling
name = "Recycling Core"
desc = "This core is optimized for energy efficency, being able to sometimes recover energy that would have been lost with other \
cores. The focus on efficency also makes instability less of an issue, as incoming instability from functions are reduced by \
40%. The capacitor is also slightly better, holding 12,000 units of energy, however the reactor is slower to recharge, at a rate \
of 40 units."
cores. Each time energy is spent, there is a 30% chance of recovering half of what was spent.<br>\
<font color='green'>Capacity: 12k</font><br>\
<font color='red'>Recharge: 40/s</font><br>\
<font color='green'>Instability Modifier: 60%</font><br>\
<font color='green'>Energy Cost Modifier: 80%</font><br>\
Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/recycling
/datum/technomancer/equipment/summoning
name = "Summoning Core"
desc = "A unique type of core, this one sacrifices other characteristics in order to optimize it for the purposes teleporting \
entities from vast distances, and keeping them there. Wearers of this core can maintain up to 30 summons at once, and the energy \
demand for maintaining summons is severely reduced. This comes at the price of capcitors that can only hold 8,000 units of energy, \
a recharging rate of 35 energy, and no shielding from instability."
entities from vast distances, and keeping them there. Wearers of this core can maintain up to 40 summons at once, and the energy \
demand for maintaining summons is severely reduced.<br>\
<font color='red'>Capacity: 8k</font><br>\
<font color='red'>Recharge: 35/s</font><br>\
<font color='red'>Instability Modifier: 120%</font><br>\
Energy Cost Modifier: 100%<br>\
<font color='green'>Spell Power: 120%</font>"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/summoner
/datum/technomancer/equipment/safety
name = "Safety Core"
desc = "This core is designed so that the wearer suffers almost no instability. It unfortunately comes at a cost of subpar \
ratings for everything else.<br>\
<font color='red'>Capacity: 7k</font><br>\
<font color='red'>Recharge: 30/s</font><br>\
<font color='green'><b>Instability Modifier: 30%</b></font><br>\
Energy Cost Modifier: 100%<br>\
<font color='red'><b>Spell Power: 70%</b></font>"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/safety
/datum/technomancer/equipment/overcharged
name = "Overcharged Core"
desc = "A core that was created in order to get the most power out of functions. It does this by shoving the most power into \
those functions, so it is the opposite of energy efficent, however the enhancement of functions is second to none for other \
cores.<br>\
<font color='red'>Capacity: 15k (effectively 7.5k)</font><br>\
<font color='red'>Recharge: 40/s</font><br>\
<font color='red'>Instability Modifier: 110%</font><br>\
<font color='red'><b>Energy Cost Modifier: 200%</b></font><br>\
<font color='green'><b>Spell Power: 175%</b></font>"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/overcharged
/datum/technomancer/equipment/hypo_belt
name = "Hypo Belt"
desc = "A medical belt designed to carry autoinjectors and other medical equipment. Comes with one of each hypo."
@@ -154,3 +205,15 @@
if(istype(item_to_test, /obj/item/weapon/spell))
var/obj/item/weapon/spell/S = item_to_test
S.on_scepter_ranged_cast(target, user)
/datum/technomancer/equipment/spyglass
name = "Spyglass"
desc = "A mundane spyglass, it may prove useful to those who wish to scout ahead, or fight from an extreme range."
cost = 100
obj_path = /obj/item/device/binoculars/spyglass
/obj/item/device/binoculars/spyglass
name = "spyglass"
desc = "It's a hand-held telescope, useful for star-gazing, peeping, and recon."
icon_state = "spyglass"
slot_flags = SLOT_BELT
@@ -112,7 +112,7 @@
/obj/item/weapon/spell/proc/adjust_instability(var/amount)
if(!owner || !core)
return 0
amount = round(amount * core.instability_modifer, 0.1)
amount = round(amount * core.instability_modifier, 0.1)
owner.adjust_instability(amount)
// Proc: New()
@@ -25,6 +25,15 @@
return 0
return 1
/obj/item/weapon/spell/proc/within_range(var/atom/target, var/max_range = 7) // Beyond 7 is off the screen.
if(range(get_dist(owner, target) <= max_range))
return TRUE
return FALSE
/obj/item/weapon/spell/proc/calculate_spell_power(var/amount)
if(core)
return round(amount * core.spell_power_modifier, 1)
// Returns a 'target' mob from a radius around T.
/obj/item/weapon/spell/proc/targeting_assist(var/turf/T, radius = 5)
var/chosen_target = null
@@ -14,7 +14,7 @@
aspect = ASPECT_TELE
/obj/item/weapon/spell/abjuration/on_ranged_cast(atom/hit_atom, mob/user)
if(istype(hit_atom, /mob/living) && pay_energy(500))
if(istype(hit_atom, /mob/living) && pay_energy(500) && within_range(hit_atom))
var/mob/living/L = hit_atom
var/mob/living/simple_animal/SA = null
@@ -2,6 +2,7 @@
name = "Apportation"
desc = "This allows you to teleport objects into your hand, or to pull people towards you. If they're close enough, the function \
will grab them automatically."
enhancement_desc = "Range is unlimited."
cost = 25
obj_path = /obj/item/weapon/spell/apportation
category = UTILITY_SPELLS
@@ -22,6 +23,9 @@
if(AM.anchored)
user << "<span class='warning'>\The [hit_atom] is firmly secured and anchored, you can't move it!</span>"
return
if(!within_range(hit_atom) && !check_for_scepter())
user << "<span class='warning'>\The [hit_atom] is too far away.</span>"
return
//Teleporting an item.
if(istype(hit_atom, /obj/item))
var/obj/item/I = hit_atom
@@ -38,6 +42,7 @@
src.loc = null
user.put_in_hands(I)
user.visible_message("<span class='notice'>\A [I] appears in \the [user]'s hand!</span>")
log_and_message_admins("has stolen [I] with [src].")
qdel(src)
//Now let's try to teleport a living mob.
else if(istype(hit_atom, /mob/living))
@@ -1,8 +1,8 @@
/datum/technomancer/spell/audible_deception
name = "Audible Deception"
desc = "Allows you to create a specific sound at a location of your choosing."
enhancement_desc = "An extremely loud sound that a large amount of energy and instability becomes available, which will \
deafen and stun all who are near the targeted tile, including yourself if unprotected."
enhancement_desc = "An extremely loud bike horn sound that costs large amount of energy and instability becomes available, \
which will deafen and stun all who are near the targeted tile, including yourself if unprotected."
cost = 50
obj_path = /obj/item/weapon/spell/audible_deception
ability_icon_state = "tech_audibledeception"
@@ -8,11 +8,13 @@
/obj/item/weapon/spell/aura/New()
..()
set_light(7, 4, l_color = glow_color)
set_light(7, calculate_spell_power(4), l_color = glow_color)
processing_objects |= src
log_and_message_admins("has started casting [src].")
/obj/item/weapon/spell/aura/Destroy()
processing_objects -= src
log_and_message_admins("has stopped maintaining [src].")
..()
/obj/item/weapon/spell/aura/process()
@@ -1,6 +1,7 @@
/datum/technomancer/spell/biomed_aura
name = "Restoration Aura"
desc = "Heals you and your allies (or everyone, if you want) of trauma and burns slowly, as long as they remain within four meters."
spell_power_desc = "Increases the radius and healing amount of the aura."
cost = 100
obj_path = /obj/item/weapon/spell/aura/biomed
ability_icon_state = "tech_biomedaura"
@@ -21,7 +22,7 @@
qdel(src)
regen_tick++
if(regen_tick % 5 == 0)
var/list/nearby_mobs = range(4,owner)
var/list/nearby_mobs = range(calculate_spell_power(4),owner)
var/list/mobs_to_heal = list()
for(var/mob/living/L in nearby_mobs)
if(heal_allies_only)
@@ -30,8 +31,8 @@
else
mobs_to_heal |= L // Heal everyone!
for(var/mob/living/L in mobs_to_heal)
L.adjustBruteLoss(-2)
L.adjustFireLoss(-2)
L.adjustBruteLoss(calculate_spell_power(-2))
L.adjustFireLoss(calculate_spell_power(-2))
adjust_instability(2)
/obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user)
@@ -4,6 +4,7 @@
This does not affect you or your allies. It also causes a large amount of fire to erupt around you, however the main threat is \
still the heating up."
enhancement_desc = "Increased heat generation, more fires, and higher temperature cap."
spell_power_desc = "Radius, heat rate, heat capacity, and amount of fires made increased."
cost = 100
obj_path = /obj/item/weapon/spell/aura/fire
ability_icon_state = "tech_fireaura"
@@ -19,16 +20,17 @@
/obj/item/weapon/spell/aura/fire/process()
if(!pay_energy(100))
qdel(src)
var/list/nearby_things = range(4,owner)
var/list/nearby_things = range(calculate_spell_power(4),owner)
var/temp_change = 40
var/temp_cap = 600
var/fire_power = 2
var/temp_change = calculate_spell_power(40)
var/temp_cap = calculate_spell_power(600)
var/fire_power = calculate_spell_power(2)
if(check_for_scepter())
temp_change = 80
temp_cap = 1000
fire_power = 4
temp_change = calculate_spell_power(80)
temp_cap = calculate_spell_power(1000)
fire_power = calculate_spell_power(4)
for(var/mob/living/carbon/human/H in nearby_things)
if(is_ally(H))
continue
@@ -1,8 +1,9 @@
/datum/technomancer/spell/frost_aura
name = "Chilling Aura"
desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to freeze to death if \
desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to become very slow if \
they stay within four meters of you."
enhancement_desc = "The chill becomes lethal."
spell_power_desc = "Radius and rate of cooling are scaled."
cost = 100
obj_path = /obj/item/weapon/spell/aura/frost
ability_icon_state = "tech_frostaura"
@@ -19,13 +20,13 @@
/obj/item/weapon/spell/aura/frost/process()
if(!pay_energy(100))
qdel(src)
var/list/nearby_mobs = range(4,owner)
var/list/nearby_mobs = range(calculate_spell_power(4),owner)
var/temp_change = 25
var/temp_change = calculate_spell_power(25)
var/temp_cap = 260 // Just above the damage threshold, for humans. Unathi are less fortunate.
if(check_for_scepter())
temp_change = 50
temp_change = calculate_spell_power(50)
temp_cap = 200
for(var/mob/living/carbon/human/H in nearby_mobs)
if(is_ally(H))
@@ -1,6 +1,8 @@
/datum/technomancer/spell/shock_aura
name = "Electric Aura"
desc = "Repeatively electrocutes enemies within four meters of you, as well as nearby electronics."
enhancement_desc = "Aura does twice as much damage."
spell_power_desc = "Radius and damage scaled up."
cost = 100
obj_path = /obj/item/weapon/spell/aura/shock
ability_icon_state = "tech_shockaura"
@@ -17,11 +19,11 @@
/obj/item/weapon/spell/aura/shock/process()
if(!pay_energy(1000))
qdel(src)
var/list/nearby_mobs = range(4,owner)
var/power = 7
var/list/nearby_mobs = range(calculate_spell_power(4),owner)
var/power = calculate_spell_power(7)
if(check_for_scepter())
power = 15
for(var/obj/machinery/light/light in range(7, owner))
power = calculate_spell_power(15)
for(var/obj/machinery/light/light in range(calculate_spell_power(7), owner))
light.flicker()
for(var/mob/living/L in nearby_mobs)
if(is_ally(L))
@@ -1,7 +1,9 @@
/datum/technomancer/spell/unstable_aura
name = "Degen Aura"
desc = "Destabalizes your enemies, breaking their elements down to their basic levels, slowly killing them from the inside. \
For each person within fourteen meters of you, they suffer 1% of their current health every second. Your allies are unharmed."
For each person within <b>fourteen meters</b> of you, they suffer 1% of their current health every second. Your allies are \
unharmed."
spell_power_desc = "Radius is increased."
cost = 150
obj_path = /obj/item/weapon/spell/aura/unstable
ability_icon_state = "tech_unstableaura"
@@ -13,12 +15,12 @@
icon_state = "generic"
cast_methods = null
aspect = ASPECT_UNSTABLE
glow_color = "#0000FF" //TODO
glow_color = "#CC00CC"
/obj/item/weapon/spell/aura/unstable/process()
if(!pay_energy(200))
qdel(src)
var/list/nearby_mobs = range(14,owner)
var/list/nearby_mobs = range(calculate_spell_power(14),owner)
for(var/mob/living/L in nearby_mobs)
if(is_ally(L))
continue
@@ -3,6 +3,7 @@
desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, to someone trying to \
fight you, or even yourself. Using this on someone next to you makes their potential distance after teleportation greater."
enhancement_desc = "Blink distance is increased greatly."
spell_power_desc = "Blink distance is scaled up with more spell power."
cost = 50
obj_path = /obj/item/weapon/spell/blink
category = UTILITY_SPELLS
@@ -50,22 +51,28 @@
/obj/item/weapon/spell/blink/on_ranged_cast(atom/hit_atom, mob/user)
if(istype(hit_atom, /atom/movable))
var/atom/movable/AM = hit_atom
if(!within_range(AM))
user << "<span class='warning'>\The [AM] is too far away to blink.</span>"
return
if(check_for_scepter())
safe_blink(user, 6)
safe_blink(AM, calculate_spell_power(6))
else
safe_blink(AM, 3)
safe_blink(AM, calculate_spell_power(3))
log_and_message_admins("has blinked [AM] away.")
/obj/item/weapon/spell/blink/on_use_cast(mob/user)
if(check_for_scepter())
safe_blink(user, 10)
safe_blink(user, calculate_spell_power(10))
else
safe_blink(user, 6)
safe_blink(user, calculate_spell_power(6))
log_and_message_admins("has blinked themselves away.")
/obj/item/weapon/spell/blink/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
if(istype(hit_atom, /atom/movable))
var/atom/movable/AM = hit_atom
visible_message("<span class='danger'>\The [user] reaches out towards \the [AM] with a glowing hand.</span>")
if(check_for_scepter())
safe_blink(user, 10)
safe_blink(AM, 10)
else
safe_blink(AM, 6)
safe_blink(AM, 6)
log_and_message_admins("has blinked [AM] away.")
@@ -17,7 +17,7 @@
/obj/item/weapon/spell/condensation/on_ranged_cast(atom/hit_atom, mob/user)
if(pay_energy(200))
if(istype(hit_atom, /turf/simulated))
if(istype(hit_atom, /turf/simulated) && within_range(hit_atom))
var/turf/simulated/T = hit_atom
for(var/direction in alldirs + null) // null is for the center tile.
@@ -30,6 +30,7 @@
W.set_color()
W.set_up(desired_turf)
flick(initial(icon_state),W) // Otherwise pooling causes the animation to stay stuck at the end.
log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].")
else if(hit_atom.reagents && !ismob(hit_atom))
hit_atom.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0)
adjust_instability(5)
@@ -146,6 +146,7 @@
return 0
if(pay_energy(50 * controlled_mobs.len))
attack_all(L)
log_and_message_admins("has commanded their army of [controlled_mobs.len] to attack [L].")
user << "<span class='notice'>You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \
attack \the [L].</span>"
//This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second.
@@ -16,9 +16,10 @@
aspect = ASPECT_BIOMED
/obj/item/weapon/spell/dispel/on_ranged_cast(atom/hit_atom, mob/living/user)
if(isliving(hit_atom) && pay_energy(1000))
if(isliving(hit_atom) && within_range(hit_atom) && pay_energy(1000))
var/mob/living/target = hit_atom
for(var/obj/item/weapon/inserted_spell/I in target)
I.on_expire(dispelled = 1)
log_and_message_admins("dispelled [I] on [target].")
user.adjust_instability(10)
qdel(src)
@@ -4,6 +4,7 @@
Every second, electricity is stolen until the link is broken by the target moving too far away, or having no more energy left. \
Can drain from powercells, microbatteries, and other Cores. The beam created by the siphoning is harmful to touch."
enhancement_desc = "Rate of siphoning is doubled."
spell_power_desc = "Rate of siphoning is scaled up based on spell power."
cost = 100
obj_path = /obj/item/weapon/spell/energy_siphon
ability_icon_state = "tech_energysiphon"
@@ -48,7 +49,7 @@
/obj/item/weapon/spell/energy_siphon/on_ranged_cast(atom/hit_atom, mob/user)
if(istype(hit_atom, /atom/movable))
if(istype(hit_atom, /atom/movable) && within_range(hit_atom, 4))
var/atom/movable/AM = hit_atom
populate_siphon_list(AM)
if(!things_to_siphon.len)
@@ -56,6 +57,7 @@
return 0
siphoning = AM
update_icon()
log_and_message_admins("is siphoning energy from \a [AM].")
else
stop_siphoning()
@@ -84,7 +86,7 @@
/obj/item/weapon/spell/energy_siphon/proc/siphon(atom/movable/siphoning, mob/user)
var/list/things_to_drain = things_to_siphon // Temporary list copy of what we're gonna steal from.
var/charge_to_give = 0 // How much energy to give to the Technomancer at the end.
var/flow_remaining = flow_rate
var/flow_remaining = calculate_spell_power(flow_rate)
if(!siphoning)
return 0
@@ -46,6 +46,7 @@
visible_message("<span class='danger'>\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!</span>")
L << "<span class='danger'>You ignite!</span>"
L.fire_act()
log_and_message_admins("has ignited [L] with [src].")
adjust_instability(12)
else
//This is needed in order for the welder to work, and works similarly to grippers.
@@ -2,6 +2,7 @@
name = "Corona"
desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \
bright glow also makes it very difficult to be stealthy. The effect lasts for one minute."
spell_power_desc = "Enemies become even easier to hit."
cost = 50
obj_path = /obj/item/weapon/spell/insert/corona
ability_icon_state = "tech_corona"
@@ -18,11 +19,16 @@
spell_light_range = 3
inserting = /obj/item/weapon/inserted_spell/corona
/obj/item/weapon/inserted_spell/corona
var/evasion_reduction = 2 // We store this here because spell power may change when the spell expires.
/obj/item/weapon/inserted_spell/corona/on_insert()
spawn(1)
if(isliving(host))
var/mob/living/L = host
L.evasion -= 2
evasion_reduction = round(2 * spell_power_at_creation, 1)
L.evasion -= evasion_reduction
L.visible_message("<span class='warning'>You start to glow very brightly!</span>")
spawn(1 MINUTE)
if(src)
@@ -31,6 +37,6 @@
/obj/item/weapon/inserted_spell/corona/on_expire()
if(isliving(host))
var/mob/living/L = host
L.evasion += 2
L.evasion += evasion_reduction
L << "<span class='notice'>Your glow has ended.</span>"
..()
@@ -2,6 +2,7 @@
name = "Haste"
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
runs extremly fast, and cannot be slowed by any means."
spell_power_desc = "Duration is scaled up."
cost = 100
obj_path = /obj/item/weapon/spell/insert/haste
ability_icon_state = "tech_haste"
@@ -23,7 +24,7 @@
L.force_max_speed = 1
L << "<span class='notice'>You suddenly find it much easier to move.</span>"
L.adjust_instability(10)
spawn(5 SECONDS)
spawn(round(5 SECONDS * spell_power_at_creation, 1))
if(src)
on_expire()
@@ -18,6 +18,7 @@
/obj/item/weapon/inserted_spell
var/mob/living/carbon/human/origin = null
var/mob/living/host = null
var/spell_power_at_creation = 1.0 // This is here because the spell object that made this object probably won't exist.
/obj/item/weapon/inserted_spell/New(var/newloc, var/user, var/obj/item/weapon/spell/insert/inserter)
..(newloc)
@@ -42,7 +43,9 @@
if(IS.type == inserting)
user << "<span class='warning'>\The [L] is already affected by \the [src].</span>"
return
new inserting(L,user,src)
var/obj/item/weapon/inserted_spell/inserted = new inserting(L,user,src)
inserted.spell_power_at_creation = calculate_spell_power(1.0)
log_and_message_admins("has casted [src] on [L].")
qdel(src)
/obj/item/weapon/spell/insert/on_melee_cast(atom/hit_atom, mob/user)
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_burns
name = "Mend Burns"
desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers."
spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_burns
ability_icon_state = "tech_mendburns"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_metal
name = "Mend Metal"
desc = "Restores integrity to external robotic components."
spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_metal
ability_icon_state = "tech_mendwounds"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
@@ -2,6 +2,7 @@
name = "Great Mend Wounds"
desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \
robotic, reforms bones, patches internal bleeding, and restores missing blood."
spell_power_desc = "Healing amount increased."
cost = 100
obj_path = /obj/item/weapon/spell/insert/mend_organs
ability_icon_state = "tech_mendwounds"
@@ -21,6 +22,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 2 : 5
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(15)
for(var/i = 0, i<5,i++)
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_wires
name = "Mend Wires"
desc = "Binds the internal wiring of robotic limbs and components over time."
spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wires
ability_icon_state = "tech_mendwounds"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
@@ -2,6 +2,7 @@
name = "Mend Wounds"
desc = "Heals minor wounds, such as cuts, bruises, and other non-lifethreatening injuries. \
Instability is split between the target and technomancer, if seperate."
spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wounds
ability_icon_state = "tech_mendwounds"
@@ -21,6 +22,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
@@ -1,6 +1,7 @@
/datum/technomancer/spell/purify
name = "Purify"
desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such."
spell_power_desc = "Healing amount increased."
cost = 25
obj_path = /obj/item/weapon/spell/insert/purify
ability_icon_state = "tech_purify"
@@ -24,6 +25,7 @@
// for(var/datum/disease/D in H.viruses)
// D.cure()
var/heal_power = host == origin ? 10 : 30
heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
@@ -2,6 +2,7 @@
name = "Repel Missiles"
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
to hit you. The field lasts for five minutes and can be granted to yourself or an ally."
spell_power_desc = "Projectiles will be more likely to be deflected."
cost = 25
obj_path = /obj/item/weapon/spell/insert/repel_missiles
ability_icon_state = "tech_repelmissiles"
@@ -16,11 +17,15 @@
light_color = "#FF5C5C"
inserting = /obj/item/weapon/inserted_spell/repel_missiles
/obj/item/weapon/inserted_spell/repel_missiles
var/evasion_increased = 2 // We store this here because spell power may change when the spell expires.
/obj/item/weapon/inserted_spell/repel_missiles/on_insert()
spawn(1)
if(isliving(host))
var/mob/living/L = host
L.evasion += 2
evasion_increased = round(2 * spell_power_at_creation, 1)
L.evasion += evasion_increased
L << "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
spawn(5 MINUTES)
if(src)
@@ -29,6 +34,6 @@
/obj/item/weapon/inserted_spell/repel_missiles/on_expire()
if(isliving(host))
var/mob/living/L = host
L.evasion -= 2
L.evasion -= evasion_increased
L << "<span class='warning'>Your repulsion field has expired.</span>"
..()
@@ -2,6 +2,7 @@
name = "Instability Tap"
desc = "Creates a large sum of energy, at the cost of a very large amount of instability afflicting you."
enhancement_desc = "50% more energy gained, 20% less instability gained."
spell_power_desc = "Amount of energy gained scaled up with spell power."
cost = 100
obj_path = /obj/item/weapon/spell/instability_tap
ability_icon_state = "tech_instabilitytap"
@@ -18,10 +19,11 @@
set_light(3, 2, l_color = "#FA58F4")
/obj/item/weapon/spell/instability_tap/on_use_cast(mob/user)
var/amount = calculate_spell_power(5000)
if(check_for_scepter())
core.give_energy(7500)
core.give_energy(amount * 1.5)
adjust_instability(40)
else
core.give_energy(5000)
core.give_energy(amount)
adjust_instability(50)
qdel(src)
@@ -16,6 +16,8 @@
cooldown = 30
/obj/item/weapon/spell/oxygenate/on_ranged_cast(atom/hit_atom, mob/user)
if(!within_range(hit_atom))
return
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(pay_energy(1500))
@@ -15,7 +15,6 @@
/obj/item/weapon/spell/phase_shift/New()
..()
set_light(3, 2, l_color = "#FA58F4")
processing_objects |= src
/obj/effect/phase_shift
name = "rift"
@@ -29,6 +28,7 @@
/obj/effect/phase_shift/New()
..()
set_light(3, 5, l_color = "#FA58F4")
processing_objects |= src
/obj/effect/phase_shift/Destroy()
for(var/atom/movable/AM in contents) //Eject everything out.
@@ -1,6 +1,7 @@
/datum/technomancer/spell/beam
name = "Beam"
desc = "Fires a laser at your target. Cheap, reliable, and a bit boring."
spell_power_desc = "Increases damage dealt."
cost = 100
ability_icon_state = "tech_beam"
obj_path = /obj/item/weapon/spell/projectile/beam
@@ -2,7 +2,7 @@
name = "Chain Lightning"
desc = "This dangerous function shoots lightning that will strike someone, then bounce to a nearby person. Be careful that \
it does not bounce to you. The lighting prefers to bounce to people with the least resistance to electricity. It will \
strike up to four targets, including yourself if conditions allow it to occur."
strike up to four targets, including yourself if conditions allow it to occur. Lightning functions cannot miss due to distance."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/chain_lightning
ability_icon_state = "tech_chain_lightning"
@@ -2,6 +2,7 @@
name = "Force Missile"
desc = "This fires a missile at your target. It's cheap to use, however the projectile itself moves and impacts in such a way \
that armor designed to protect from blunt force will mitigate this function as well."
spell_power_desc = "Increases damage dealt."
cost = 50
obj_path = /obj/item/weapon/spell/projectile/force_missile
category = OFFENSIVE_SPELLS
@@ -2,7 +2,7 @@
name = "Lightning Strike"
desc = "This uses a hidden electrolaser, which creates a laser beam to ionize the enviroment, allowing for ideal conditions \
for a directed lightning strike to occur. The lightning is very strong, however it requires a few seconds to prepare a \
strike."
strike. Lightning functions cannot miss due to distance."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/lightning
category = OFFENSIVE_SPELLS
@@ -1,7 +1,8 @@
/datum/technomancer/spell/overload
name = "Overload"
desc = "Fires a bolt of highly unstable energy, that does damaged equal to 0.3% of the technomancer's current reserve of energy. \
This energy pierces all known armor."
This energy pierces all known armor. Energy cost is equal to 10% of maximum core charge."
enhancement_desc = "Will do damage equal to 0.4% of current energy."
cost = 100
obj_path = /obj/item/weapon/spell/projectile/overload
category = OFFENSIVE_SPELLS
@@ -12,6 +12,7 @@
/obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
if(set_up(hit_atom, user))
var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user))
new_projectile.damage = calculate_spell_power(new_projectile.damage)
new_projectile.launch(hit_atom)
log_and_message_admins("has casted [src] at \the [hit_atom].")
if(fire_sound)
@@ -1,6 +1,9 @@
/datum/technomancer/spell/radiance
name = "Radiance"
desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation."
desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation. Note \
that this WILL affect you."
enhancement_desc = "Radiation will not affect the caster or their allies."
spell_power_desc = "Spell power increases the amount of radiation and heat radiated, as well as the radius."
cost = 100
obj_path = /obj/item/weapon/spell/radiance
category = OFFENSIVE_SPELLS
@@ -10,36 +13,41 @@
desc = "You will glow with a radiance similar to that of Supermatter."
icon_state = "radiance"
aspect = ASPECT_LIGHT
var/power = 100
var/power = 250
toggled = 1
/obj/item/weapon/spell/radiance/New()
..()
set_light(7, 4, l_color = "#D9D900")
processing_objects |= src
log_and_message_admins("has casted [src].")
/obj/item/weapon/spell/radiance/Destroy()
processing_objects -= src
log_and_message_admins("has stopped maintaining [src].")
..()
/obj/item/weapon/spell/radiance/process()
var/turf/T = get_turf(src)
var/datum/gas_mixture/removed = null
var/datum/gas_mixture/env = null
var/adjusted_power = calculate_spell_power(power)
if(!istype(T, /turf/space))
env = T.return_air()
removed = env.remove(0.25 * env.total_moles) //Remove gas from surrounding area
var/thermal_power = 300 * power
var/thermal_power = 300 * adjusted_power
removed.add_thermal_energy(thermal_power)
removed.temperature = between(0, removed.temperature, 10000)
env.merge(removed)
for(var/mob/living/L in range(T, round(sqrt(power / 2))))
for(var/mob/living/L in range(T, round(sqrt(adjusted_power / 2))))
if(check_for_scepter() && is_ally(L))
continue
var/radius = max(get_dist(L, src), 1)
var/rads = (power / 10) * ( 1 / (radius**2) )
var/rads = (adjusted_power / 10) * ( 1 / (radius**2) )
L.apply_effect(rads, IRRADIATE)
adjust_instability(2)
@@ -25,7 +25,7 @@
user << "<span class='warning'>\The [L] isn't dead!</span>"
return 0
if(pay_energy(5000))
if(L.tod > world.time + 10 MINUTES)
if(L.tod > world.time + 30 MINUTES)
user << "<span class='danger'>\The [L]'s been dead for too long, even this function cannot replace cloning at \
this point.</span>"
return 0
@@ -57,7 +57,8 @@
H.timeofdeath = null
visible_message("<span class='danger'>\The [H]'s eyes open!</span>")
user << "<span class='notice'>It's alive!</span>"
adjust_instability(100)
adjust_instability(50)
log_and_message_admins("has resurrected [H].")
else
user << "<span class='warning'>The body of \the [H] doesn't seem to respond, perhaps you could try again?</span>"
adjust_instability(10)
@@ -1,6 +1,7 @@
/datum/technomancer/spell/shared_burden
name = "Shared Burden"
desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability."
spell_power_desc = "Draws bonus instability from the target, with the bonus dissipating harmlessly, for 'free'."
cost = 50
obj_path = /obj/item/weapon/spell/shared_burden
category = SUPPORT_SPELLS
@@ -13,16 +14,16 @@
aspect = ASPECT_UNSTABLE
/obj/item/weapon/spell/shared_burden/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
if(ishuman(hit_atom))
if(ishuman(hit_atom) && within_range(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(H == user)
user << "<span class='warning'>Draining instability out of you to put it back seems a bit pointless.</span>"
return 0
if(!H.instability)
if(H.instability <= 0)
user << "<span class='warning'>\The [H] has no instability to drain.</span>"
return 0
if(pay_energy(500))
var/instability_to_drain = min(H.instability, 25)
user << "<span class='notice'>You draw instability away from \the [H] and towards you.</span>"
adjust_instability(instability_to_drain)
H.adjust_instability(-instability_to_drain)
H.adjust_instability(-calculate_spell_power(instability_to_drain))
@@ -1,7 +1,9 @@
/datum/technomancer/spell/shield
name = "Shield"
desc = "Emits a protective shield fron your hand in front of you, which will protect you from almost anything able to harm \
you, so long as you can power it."
you, so long as you can power it. Stronger attacks blocked cost more energy to sustain. \
Note that holding two shields will make blocking more energy efficent."
enhancement_desc = "Blocking is twice as efficent in terms of energy cost per hit."
cost = 100
obj_path = /obj/item/weapon/spell/shield
ability_icon_state = "tech_shield"
@@ -15,7 +15,7 @@
spawner_type = /obj/effect/temporary_effect/fire_blast
/obj/item/weapon/spell/spawner/fire_blast/on_ranged_cast(atom/hit_atom, mob/user)
if(pay_energy(2000))
if(within_range(hit_atom) && pay_energy(2000))
adjust_instability(12)
..() // Makes the booms happen.
@@ -18,7 +18,7 @@
set_light(3, 2, l_color = "#2ECCFA")
/obj/item/weapon/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user)
if(pay_energy(4000))
if(within_range(hit_atom) && pay_energy(4000))
adjust_instability(8)
..()
@@ -27,4 +27,5 @@
if(T)
new spawner_type(T)
user << "<span class='notice'>You shift \the [src] onto \the [T].</span>"
log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].")
qdel(src)
@@ -13,7 +13,7 @@
/obj/item/weapon/spell/summon/on_ranged_cast(atom/hit_atom, mob/living/user)
var/turf/T = get_turf(hit_atom)
if(summoned_mob_type && core.summoned_mobs.len < core.max_summons && pay_energy(energy_cost))
if(summoned_mob_type && core.summoned_mobs.len < core.max_summons && within_range(hit_atom) && pay_energy(energy_cost))
var/obj/effect/E = new(T)
E.icon = 'icons/obj/objects.dmi'
E.icon_state = "anom"
@@ -29,6 +29,7 @@
on_summon(L)
user << "<span class='notice'>You've successfully teleported \a [L] to you!</span>"
visible_message("<span class='warning'>\A [L] appears from no-where!</span>")
log_and_message_admins("has summoned \a [L] at [T.x],[T.y],[T.z].")
user.adjust_instability(instability_cost)
/obj/item/weapon/spell/summon/on_use_cast(mob/living/user)
@@ -6,6 +6,7 @@
The creatures take a few moments to be teleported to the targeted tile. Note that the creatures summoned are \
not inherently loyal to the technomancer, and that the creatures will be hurt slightly from being teleported to you."
enhancement_desc = "Summoned entities will never harm their summoner."
spell_power_desc = "The strength and endurance of the summoned creature will be greater."
cost = 100
obj_path = /obj/item/weapon/spell/summon/summon_creature
category = UTILITY_SPELLS
@@ -37,10 +38,18 @@
instability_cost = 10
energy_cost = 1000
/obj/item/weapon/spell/summon/summon_creature/on_summon(var/mob/living/summoned)
/obj/item/weapon/spell/summon/summon_creature/on_summon(var/mob/living/simple_animal/summoned)
if(check_for_scepter())
// summoned.faction = "technomancer"
if(istype(summoned, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/SA = summoned
SA.friends.Add(owner)
// Makes their new pal big and strong, if they have spell power.
summoned.maxHealth = calculate_spell_power(summoned.maxHealth)
summoned.health = calculate_spell_power(summoned.health)
summoned.melee_damage_lower = calculate_spell_power(summoned.melee_damage_lower)
summoned.melee_damage_upper = calculate_spell_power(summoned.melee_damage_upper)
// Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
summoned.health = round(summoned.maxHealth * 0.7)
@@ -1,8 +1,9 @@
/datum/technomancer/spell/summon_ward
name = "Summon Ward"
desc = "Teleports a prefabricated 'ward' drone to the target location, which will alert you and your allies when it sees entities \
moving around it, or when it is attacked. They can see for up to five meters. Wards expire in six minutes."
enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees."
moving around it, or when it is attacked. They can see for up to five meters."
enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees. \
Invisible entities that are spotted by it will be decloaked."
cost = 25
obj_path = /obj/item/weapon/spell/summon/summon_ward
category = UTILITY_SPELLS
@@ -23,6 +23,8 @@
/obj/item/weapon/spell/warp_strike/on_ranged_cast(atom/hit_atom, mob/user)
var/turf/T = get_turf(hit_atom)
if(T)
if(!within_range(T))
return
//First, we handle who to teleport to.
user.setClickCooldown(5)
var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked.
@@ -74,4 +76,5 @@
I.afterattack(chosen_target, user)
else
chosen_target.attack_hand(user)
log_and_message_admins("has warp striked [chosen_target].")
+2 -2
View File
@@ -151,7 +151,7 @@
delete_me = 1
/obj/effect/landmark/costume/butler/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/accessory/wcoat(src.loc)
new /obj/item/clothing/under/suit_jacket(src.loc)
new /obj/item/clothing/head/that(src.loc)
delete_me = 1
@@ -170,7 +170,7 @@
delete_me = 1
/obj/effect/landmark/costume/prig/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/accessory/wcoat(src.loc)
new /obj/item/clothing/glasses/monocle(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that)
new CHOICE(src.loc)
+1 -1
View File
@@ -218,7 +218,7 @@
// implant uplink (not the implant tool) and a preset headset uplink.
/obj/item/device/radio/uplink/New()
hidden_uplink = new(src)
hidden_uplink = new(src, usr.mind, DEFAULT_TELECRYSTAL_AMOUNT)
icon_state = "radio"
/obj/item/device/radio/uplink/attack_self(mob/user as mob)
+13 -10
View File
@@ -35,20 +35,20 @@
return
//check for an aggressive grab (or robutts)
var/can_place
if(istype(user, /mob/living/silicon/robot))
can_place = 1
else
for (var/obj/item/weapon/grab/G in C.grabbed_by)
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
can_place = 1
break
if(can_place)
if(can_place(C, user))
place_handcuffs(C, user)
else
user << "<span class='danger'>You need to have a firm grip on [C] before you can put \the [src] on!</span>"
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
if(istype(user, /mob/living/silicon/robot))
return 1
else
for(var/obj/item/weapon/grab/G in target.grabbed_by)
if(G.loc == user && G.state >= GRAB_AGGRESSIVE)
return 1
return 0
/obj/item/weapon/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user)
playsound(src.loc, cuff_sound, 30, 1, -2)
@@ -69,6 +69,9 @@
if(!do_after(user,30))
return 0
if(!can_place(target, user)) //victim may have resisted out of the grab in the meantime
return 0
H.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been handcuffed (attempt) by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to handcuff [H.name] ([H.ckey])</font>")
msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)]")
@@ -138,6 +138,7 @@
new /obj/item/clothing/gloves/chameleon(src)
new /obj/item/clothing/mask/chameleon(src)
new /obj/item/clothing/glasses/chameleon(src)
new /obj/item/clothing/accessory/chameleon(src)
new /obj/item/weapon/gun/energy/chameleon(src)
/obj/item/weapon/storage/box/syndie_kit/clerical
@@ -21,7 +21,13 @@
var/store_items = 1
var/store_mobs = 1
var/list/will_contain
/obj/structure/closet/initialize()
..()
if(will_contain)
create_objects_in_loc(src, will_contain)
if(!opened) // if closed, any item at the crate's loc is put in the contents
var/obj/item/I
for(I in src.loc)
@@ -29,8 +29,8 @@
new /obj/item/clothing/under/rank/bartender(src)
new /obj/item/clothing/under/rank/bartender(src)
new /obj/item/clothing/under/dress/dress_saloon(src)
new /obj/item/clothing/suit/wcoat(src)
new /obj/item/clothing/suit/wcoat(src)
new /obj/item/clothing/accessory/wcoat(src)
new /obj/item/clothing/accessory/wcoat(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
@@ -8,20 +8,7 @@
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
New()
..()
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
return
will_contain = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 10)
/obj/structure/closet/secure_closet/bar/update_icon()
if(broken)
-2
View File
@@ -17,8 +17,6 @@
// This is not great.
/turf/simulated/proc/wet_floor(var/wet_val = 1)
spawn(0)
if(wet_val <= wet)
return
wet = wet_val
if(wet_overlay)
overlays -= wet_overlay
+25
View File
@@ -664,6 +664,31 @@ proc/admin_notice(var/message, var/rights)
log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/intercom()
set category = "Fun"
set name = "Intercom Msg"
set desc = "Send an intercom message, like an arrivals announcement."
if(!check_rights(0)) return
//This is basically how death alarms do it
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/ert(null)
var/channel = input("Channel for message:","Channel", null) as null|anything in (list("Common") + a.keyslot1.channels + a.keyslot2.channels)
if(channel) //They picked a channel
var/sender = input("Name of sender (max 75):", "Announcement", "Announcement Computer") as null|text
if(sender) //They put a sender
sender = sanitize(sender, 75, extra = 0)
var/message = input("Message content (max 500):", "Contents", "This is a test of the announcement system.") as null|message
if(message) //They put a message
message = sanitize(message, 500, extra = 0)
a.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
log_admin("Intercom: [key_name(usr)] : [sender]:[message]")
qdel(a)
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleooc()
set category = "Server"
set desc="Globally Toggles OOC"
+1
View File
@@ -24,6 +24,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/toggleenter, //toggles whether people can join the current game,
/datum/admins/proc/toggleguests, //toggles whether guests can join the current game,
/datum/admins/proc/announce, //priority announce something to all clients.,
/datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement
/client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc,
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
/client/proc/toggle_view_range, //changes how far we can see,
+1 -1
View File
@@ -583,7 +583,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/accessory/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
@@ -74,6 +74,37 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/accessory/wcoat
display_name = "waistcoat"
path = /obj/item/clothing/accessory/wcoat
cost = 1
/datum/gear/accessory/wcoat/red
display_name = "waistcoat, red"
path = /obj/item/clothing/accessory/wcoat/red
/datum/gear/accessory/wcoat/grey
display_name = "waistcoat, grey"
path = /obj/item/clothing/accessory/wcoat/grey
/datum/gear/accessory/wcoat/brown
display_name = "waistcoat, brown"
path = /obj/item/clothing/accessory/wcoat/brown
/datum/gear/accessory/swvest
display_name = "sweatervest, black"
path = /obj/item/clothing/accessory/wcoat/swvest
cost = 1
/datum/gear/accessory/swvest/blue
display_name = "sweatervest, blue"
path = /obj/item/clothing/accessory/wcoat/swvest/blue
/datum/gear/accessory/swvest/red
display_name = "sweatervest, red"
path = /obj/item/clothing/accessory/wcoat/swvest/red
/datum/gear/accessory/holster
display_name = "holster, armpit"
path = /obj/item/clothing/accessory/holster/armpit
@@ -127,6 +158,10 @@
display_name = "tie, navy blue"
path = /obj/item/clothing/accessory/navy
/datum/gear/accessory/tie/white
display_name = "tie, white"
path = /obj/item/clothing/accessory/white
/datum/gear/accessory/tie/horrible
display_name = "tie, socially disgraceful"
path = /obj/item/clothing/accessory/horrible
@@ -38,6 +38,16 @@
display_name = "Security HUD, prescription (Security)"
path = /obj/item/clothing/glasses/hud/security/prescription
/datum/gear/eyes/secaviators
display_name = "Security HUD Aviators"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/eyes/secaviators/prescription
display_name = "Security HUD Aviators, prescription"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/eyes/medical
display_name = "Medical HUD (Medical)"
path = /obj/item/clothing/glasses/hud/health
@@ -56,6 +66,10 @@
display_name = "Sunglasses, stylish"
path = /obj/item/clothing/glasses/fakesunglasses
/datum/gear/eyes/glasses/fakeaviator
display_name = "Sunglasses, stylish aviators"
path = /obj/item/clothing/glasses/fakesunglasses/aviator
/datum/gear/eyes/shades/prescriptionsun
display_name = "sunglasses, presciption (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/prescription
@@ -203,36 +203,6 @@
display_name = "suspenders"
path = /obj/item/clothing/suit/suspenders
/datum/gear/suit/wcoat
display_name = "waistcoat"
path = /obj/item/clothing/suit/wcoat
cost = 1
/datum/gear/suit/wcoat/red
display_name = "red waistcoat"
path = /obj/item/clothing/suit/wcoat/red
/datum/gear/suit/wcoat/grey
display_name = "grey waistcoat"
path = /obj/item/clothing/suit/wcoat/grey
/datum/gear/suit/wcoat/brown
display_name = "brown waistcoat"
path = /obj/item/clothing/suit/wcoat/brown
/datum/gear/suit/swvest
display_name = "black sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest
cost = 1
/datum/gear/suit/swvest/blue
display_name = "blue sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest/blue
/datum/gear/suit/swvest/red
display_name = "red sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest/red
/datum/gear/suit/forensics
display_name = "forensics long, red"
path = /obj/item/clothing/suit/storage/forensics/red/long
+37 -1
View File
@@ -327,7 +327,7 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt"
origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
var/global/list/clothing_choices
/obj/item/weapon/storage/belt/chameleon/New()
..()
@@ -357,6 +357,42 @@
var/mob/M = src.loc
M.update_inv_belt() //so our overlays update.
//******************
//**Chameleon Tie**
//******************
/obj/item/clothing/accessory/chameleon
name = "black tie"
desc = "Looks like a black tie, but his one also has a dial inside."
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "blacktie"
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/clothing/accessory/chameleon/New()
..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/accessory/storage)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/accessory, blocked)
/obj/item/clothing/accessory/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "black tie"
desc = "Looks like a black tie, but his one also has a dial inside."
icon_state = "blacktie"
update_icon()
update_clothing_icon()
/obj/item/clothing/accessory/chameleon/verb/change(picked in clothing_choices)
set name = "Change Accessory Appearance"
set category = "Chameleon Items"
set src in usr
if(!ispath(clothing_choices[picked]))
return
disguise(clothing_choices[picked])
update_icon()
//*****************
//**Chameleon Gun**
//*****************
+52 -1
View File
@@ -186,7 +186,6 @@ BLIND // can't see anything
/obj/item/clothing/glasses/welding/attack_self()
toggle()
/obj/item/clothing/glasses/welding/verb/toggle()
set category = "Object"
set name = "Adjust welding goggles"
@@ -242,6 +241,11 @@ BLIND // can't see anything
icon_state = "sun"
item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses")
/obj/item/clothing/glasses/fakesunglasses/aviator
desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes."
name = "stylish aviators"
icon_state = "sec_flash"
/obj/item/clothing/glasses/sunglasses/sechud
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
@@ -258,6 +262,53 @@ BLIND // can't see anything
desc = "Flash-resistant goggles with inbuilt combat and security information."
icon_state = "swatgoggles"
/obj/item/clothing/glasses/sunglasses/sechud/aviator
name = "HUD aviators"
desc = "Modified aviator glasses that can be switch between HUD and flash protection modes."
icon_state = "sec_hud"
off_state = "sec_flash"
action_button_name = "Toggle Mode"
var/on = 1
toggleable = 1
activation_sound = 'sound/effects/pop.ogg'
var/hud_holder
/obj/item/clothing/glasses/sunglasses/sechud/aviator/New()
..()
hud_holder = hud
/obj/item/clothing/glasses/sunglasses/sechud/aviator/Destroy()
qdel(hud_holder)
hud_holder = null
hud = null
. = ..()
/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user)
if(toggleable && !user.incapacitated())
on = !on
if(on)
src.hud = hud_holder
to_chat(user, "You switch the [src] to HUD mode.")
else
src.hud = null
to_chat(user, "You switch \the [src] to flash protection mode.")
update_icon()
user << activation_sound
user.update_inv_glasses()
user.update_action_buttons()
/obj/item/clothing/glasses/sunglasses/sechud/aviator/update_icon()
if(on)
icon_state = initial(icon_state)
else
icon_state = off_state
/obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription
name = "Prescription HUD aviators"
desc = "Modified aviator glasses that can be switch between HUD and flash protection modes. Comes with bonus prescription lenses."
prescription = 6
/obj/item/clothing/glasses/thermal
name = "Optical Thermal Scanner"
desc = "Thermals in the shape of glasses."
+1 -3
View File
@@ -107,21 +107,19 @@
desc = "The hat of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
body_parts_covered = 0
siemens_coefficient = 0.8
/obj/item/clothing/head/helmet/HoS/dermal
name = "Dermal Armour Patch"
desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head."
icon_state = "dermal"
item_state_slots = list(slot_r_hand_str = "", slot_l_hand_str = "")
siemens_coefficient = 0.6
/obj/item/clothing/head/det
name = "fedora"
desc = "A brown fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it."
icon_state = "detective"
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
body_parts_covered = 0
-3
View File
@@ -294,9 +294,7 @@
desc = "A greatcoat enhanced with a special alloy for some protection and style."
icon_state = "hos"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
siemens_coefficient = 0.6
//Jensen cosplay gear
/obj/item/clothing/suit/storage/vest/hoscoat/jensen
@@ -304,7 +302,6 @@
desc = "A trenchcoat augmented with a special alloy for some protection and style."
icon_state = "hostrench"
flags_inv = 0
siemens_coefficient = 0.6
/obj/item/clothing/suit/storage/vest/pcrc
name = "PCRC armor vest"
+15 -9
View File
@@ -2,7 +2,7 @@
* Job related
*/
//Botonist
//Botanist
/obj/item/clothing/suit/apron
name = "apron"
desc = "A basic blue apron."
@@ -10,7 +10,8 @@
item_state_slots = list(slot_r_hand_str = "overalls", slot_l_hand_str = "overalls")
blood_overlay_type = "armor"
body_parts_covered = 0
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/material/minihoe)
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone, /obj/item/device/analyzer/plant_analyzer, /obj/item/seeds,
/obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/material/minihoe)
//Captain
/obj/item/clothing/suit/captunic
@@ -30,10 +31,11 @@
//Chaplain
/obj/item/clothing/suit/chaplain_hoodie
name = "chaplain hoodie"
desc = "This suit says to you 'hush'!"
desc = "This suit says to you \"Hush\"!"
icon_state = "chaplain_hoodie"
item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black")
body_parts_covered = UPPER_TORSO|ARMS
allowed = list (/obj/item/weapon/storage/bible)
//Chaplain
/obj/item/clothing/suit/nun
@@ -90,8 +92,10 @@
icon_state = "detective"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine,
/obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/flame/lighter,
/obj/item/device/taperecorder, /obj/item/device/uv_light)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/det_trench/grey
name = "grey trenchcoat"
@@ -103,7 +107,9 @@
name = "jacket"
desc = "A forensics technician jacket."
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/taperecorder,/obj/item/device/uv_light)
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine,
/obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/flame/lighter,
/obj/item/device/taperecorder, /obj/item/device/uv_light)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/forensics/red
@@ -134,8 +140,8 @@
desc = "A high-visibility vest used in work zones."
icon_state = "hazard"
blood_overlay_type = "armor"
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, \
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency_oxygen, \
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner,
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency_oxygen,
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
body_parts_covered = UPPER_TORSO
@@ -180,7 +186,7 @@
icon_open = "fr_jacket_open"
icon_closed = "fr_jacket"
blood_overlay_type = "armor"
allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \
allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe,
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen)
body_parts_covered = UPPER_TORSO|ARMS
+7 -7
View File
@@ -84,7 +84,7 @@
allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
flags_inv = HIDEJUMPSUIT
/obj/item/clothing/suit/wcoat
/*/obj/item/clothing/suit/wcoat
name = "waistcoat"
desc = "For some classy, murderous fun."
icon_state = "vest"
@@ -117,7 +117,7 @@
/obj/item/clothing/suit/wcoat/swvest/red
name = "red sweatervest"
icon_state = "sweatervest_red"
*/
/obj/item/clothing/suit/apron/overalls
name = "coveralls"
desc = "A set of denim overalls."
@@ -729,23 +729,23 @@
/obj/item/clothing/suit/varsity/red
name = "red varsity jacket"
icon_state = "suit_red"
icon_state = "varsity_red"
/obj/item/clothing/suit/varsity/purple
name = "purple varsity jacket"
icon_state = "suit_purple"
icon_state = "varsity_purple"
/obj/item/clothing/suit/varsity/green
name = "green varsity jacket"
icon_state = "suit_olive"
icon_state = "varsity_green"
/obj/item/clothing/suit/varsity/blue
name = "blue varsity jacket"
icon_state = "suit_blue"
icon_state = "varsity_blue"
/obj/item/clothing/suit/varsity/brown
name = "brown varsity jacket"
icon_state = "brown_jacket"
icon_state = "varsity_brown"
/*
* Track Jackets
@@ -114,6 +114,10 @@
name = "navy tie"
icon_state = "navytie"
/obj/item/clothing/accessory/white
name = "white tie"
icon_state = "whitetie"
/obj/item/clothing/accessory/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
@@ -130,3 +130,46 @@
if(prob(50))
icon_state = "hawaii2"
color = color_rotation(rand(-11,12)*15)
/obj/item/clothing/accessory/wcoat
name = "waistcoat"
desc = "For some classy, murderous fun."
icon_state = "vest"
item_state = "vest"
icon_override = 'icons/mob/ties.dmi'
item_state_slots = list(slot_r_hand_str = "wcoat", slot_l_hand_str = "wcoat")
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING | SLOT_TIE
body_parts_covered = UPPER_TORSO|LOWER_TORSO
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
/obj/item/clothing/accessory/wcoat/red
name = "red waistcoat"
icon_state = "red_waistcoat"
/obj/item/clothing/accessory/wcoat/grey
name = "grey waistcoat"
icon_state = "grey_waistcoat"
/obj/item/clothing/accessory/wcoat/brown
name = "brown waistcoat"
icon_state = "brown_waistcoat"
/obj/item/clothing/accessory/wcoat/gentleman
name = "elegant waistcoat"
icon_state = "elegant_waistcoat"
/obj/item/clothing/accessory/wcoat/swvest
name = "black sweatervest"
desc = "A sleeveless sweater. Wear this if you don't want your arms to be warm, or if you're a nerd."
icon_state = "sweatervest"
/obj/item/clothing/accessory/wcoat/swvest/blue
name = "blue sweatervest"
icon_state = "sweatervest_blue"
/obj/item/clothing/accessory/wcoat/swvest/red
name = "red sweatervest"
icon_state = "sweatervest_red"
+5 -4
View File
@@ -104,12 +104,14 @@
desc = "A more modern uniform for corporate investigators."
/obj/item/clothing/under/det/waistcoat
icon_state = "detective_waistcoat"
icon_state = "detective"
desc = "A rumpled white dress shirt paired with well-worn grey slacks, complete with a blue striped tie, faux-gold tie clip, and waistcoat."
starting_accessories = list(/obj/item/clothing/accessory/blue_clip, /obj/item/clothing/accessory/wcoat)
/obj/item/clothing/under/det/grey/waistcoat
icon_state = "detective2_waistcoat"
icon_state = "detective2"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/wcoat)
/*
* Head of Security
@@ -120,7 +122,7 @@
icon_state = "hos"
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.8
siemens_coefficient = 0.9
rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_security/corp
@@ -133,7 +135,6 @@
desc = "You never asked for anything that stylish."
name = "head of security's jumpsuit"
icon_state = "jensen"
siemens_coefficient = 0.6
rolled_sleeves = -1
/*
@@ -151,6 +151,7 @@
icon_state = "gentlesuit"
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/white, /obj/item/clothing/accessory/wcoat/gentleman)
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "colony director's suit"
+12 -4
View File
@@ -1,15 +1,23 @@
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
announceWhen = 5
/*
/datum/event/grid_check/setup()
endWhen = rand(30,120)
*/
/datum/event/grid_check/start()
power_failure(0)
// This sets off a chain of events that lead to the actual grid check (or perhaps worse).
// First, the Supermatter engine makes a power spike.
for(var/obj/machinery/power/generator/engine in machines)
engine.power_spike()
break // Just one engine, please.
// After that, the engine checks if a grid checker exists on the same powernet, and if so, it triggers a blackout.
// If not, lots of stuff breaks. See code/modules/power/generator.dm for that piece of code.
// power_failure(0)
/*
/datum/event/grid_check/announce()
if (prob(30))
command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
/datum/event/grid_check/end()
power_restore()
*/
@@ -8,6 +8,7 @@
var/list/hud_list[10]
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
@@ -680,7 +681,12 @@
if(istype(src.glasses, /obj/item/clothing/glasses/thermal))
number -= 1
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
number += 1
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses/sechud/aviator))
var/obj/item/clothing/glasses/sunglasses/sechud/aviator/S = src.glasses
if(!S.on)
number += 1
else
number += 1
if(istype(src.glasses, /obj/item/clothing/glasses/welding))
var/obj/item/clothing/glasses/welding/W = src.glasses
if(!W.up)
@@ -265,7 +265,12 @@
visible_message("<span class='danger'>[src]'s [W] goes off during the struggle!</span>")
return W.afterattack(target,src)
if(last_push_time + 30 > world.time)
visible_message("<span class='warning'>[M] has weakly pushed [src]!</span>")
return
var/randn = rand(1, 100)
last_push_time = world.time
if(!(species.flags & NO_SLIP) && randn <= 25)
var/armor_check = run_armor_check(affecting, "melee")
apply_effect(3, WEAKEN, armor_check)
@@ -25,21 +25,6 @@
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if (hungry >= 70) tally += hungry/50
// Loop through some slots, and add up their slowdowns. Shoes are handled below, unfortunately.
// Includes slots which can provide armor, the back slot, and suit storage.
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store) )
tally += I.slowdown
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
// This is done seperately to disallow negative numbers.
for(var/obj/item/I in list(r_hand, l_hand) )
tally += max(I.slowdown, 0)
// Dragging heavy objects will also slow you down, similar to above.
if(pulling && istype(pulling, /obj/item))
var/obj/item/pulled = pulling
tally += max(pulled.slowdown, 0)
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/E = get_organ(organ_name)
@@ -76,6 +61,24 @@
if(mRun in mutations)
tally = 0
if(species.slowdown_fixed)
return (tally+config.human_delay)
// Loop through some slots, and add up their slowdowns. Shoes are handled below, unfortunately.
// Includes slots which can provide armor, the back slot, and suit storage.
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store) )
tally += I.slowdown
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
// This is done seperately to disallow negative numbers.
for(var/obj/item/I in list(r_hand, l_hand) )
tally += max(I.slowdown, 0)
// Dragging heavy objects will also slow you down, similar to above.
if(pulling && istype(pulling, /obj/item))
var/obj/item/pulled = pulling
tally += max(pulled.slowdown, 0)
return (tally+config.human_delay)
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
+1 -1
View File
@@ -901,7 +901,7 @@
Paralyse(3)
if(hallucination)
if(hallucination >= 20)
if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT)) )
if(prob(3))
fake_attack(src)
if(!handling_hal)
@@ -121,6 +121,7 @@
var/appearance_flags = 0 // Appearance/display related features.
var/spawn_flags = 0 // Flags that specify who can spawn as this species
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/slowdown_fixed = 0 // If this is on, they're not affected by object related slowdown (positive or negative)
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
@@ -98,7 +98,7 @@
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "smashed their armoured gauntlet into"
mob_size = MOB_LARGE
mob_size = MOB_HUGE
speed = 3
environment_smash = 2
attack_sound = 'sound/weapons/heavysmash.ogg'
@@ -28,6 +28,7 @@
heat_damage_per_tick = 20
cold_damage_per_tick = 20
var/poison_per_bite = 5
var/poison_chance = 10
var/poison_type = "toxin"
faction = "spiders"
var/busy = 0
@@ -45,7 +46,7 @@
health = 40
melee_damage_lower = 5
melee_damage_upper = 10
poison_per_bite = 10
poison_per_bite = 7
var/atom/cocoon_target
poison_type = "stoxin"
var/fed = 0
@@ -68,20 +69,20 @@
..()
/mob/living/simple_animal/hostile/giant_spider/AttackingTarget()
var/target = ..()
if(isliving(target))
var/mob/living/L = target
. = ..()
if(isliving(.))
var/mob/living/L = .
if(L.reagents)
L.reagents.add_reagent("toxin", poison_per_bite)
if(prob(poison_per_bite))
L << "\red You feel a tiny prick."
L.reagents.add_reagent(poison_type, 5)
L.reagents.add_reagent(poison_type, poison_per_bite)
if(prob(poison_chance))
L << "<span class='warning'>You feel a tiny prick.</span>"
L.reagents.add_reagent(poison_type, poison_per_bite)
/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget()
var/target = ..()
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(prob(poison_per_bite))
. = ..()
if(ishuman(.))
var/mob/living/carbon/human/H = .
if(prob(poison_chance))
var/obj/item/organ/external/O = pick(H.organs)
if(!(O.robotic >= ORGAN_ROBOT))
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/, list(O, src))
@@ -268,6 +268,10 @@
icon_state = "hair_buzzcut"
species_allowed = list("Human","Unathi")
shavehair
name = "Shaved Hair"
icon_state = "hair_shaved"
crew
name = "Crewcut"
icon_state = "hair_crewcut"
@@ -625,6 +629,10 @@
name = "Dwarf Beard"
icon_state = "facial_dwarf"
shadow
name = "Five O'Clock Shadow"
icon_state = "facial_shadow"
//unathi horn beards and the like
una_chinhorn
+2 -2
View File
@@ -53,7 +53,7 @@
icon_state = "stamp-intaff"
/obj/item/weapon/stamp/centcomm
name = "centcomm rubber stamp"
name = "\improper CentCom rubber stamp"
icon_state = "stamp-cent"
/obj/item/weapon/stamp/qm
@@ -65,7 +65,7 @@
icon_state = "stamp-cargo"
/obj/item/weapon/stamp/solgov
name = "solgov stamp"
name = "\improper Sol Government rubber stamp"
icon_state = "stamp-sg"
+9 -1
View File
@@ -1238,7 +1238,7 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
if(prob(40)) // Spooky flickers.
for(var/obj/machinery/light/L in area)
L.flicker(20)
L.flicker(rand(20,30))
if(prob(25)) // Bluescreens.
emagged = 1
@@ -1256,4 +1256,12 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
if(prob(5)) // APC completely ruined.
set_broken()
/obj/machinery/power/apc/do_grid_check()
if(is_critical)
return
grid_check = TRUE
spawn(15 MINUTES) // Protection against someone deconning the grid checker after a grid check happens, preventing infinte blackout.
if(src && grid_check == TRUE)
grid_check = FALSE
#undef APC_UPDATE_ICON_COOLDOWN
+27 -2
View File
@@ -236,6 +236,31 @@
src.set_dir(turn(src.dir, -90))
/obj/machinery/power/generator/power_spike()
if(effective_gen >= max_power / 2 && powernet) // Don't make a spike if we're not making a whole lot of power.
..()
// if(!effective_gen >= max_power / 2 && powernet) // Don't make a spike if we're not making a whole lot of power.
// return
var/list/powernet_union = powernet.nodes
for(var/obj/machinery/power/terminal/T in powernet.nodes)
if(T.master && istype(T.master, /obj/machinery/power/smes))
var/obj/machinery/power/smes/S = T.master
powernet_union |= S.powernet.nodes
var/found_grid_checker = FALSE
for(var/obj/machinery/power/grid_checker/G in powernet_union)
G.power_failure(prob(30)) // If we found a grid checker, then all is well.
found_grid_checker = TRUE
if(!found_grid_checker) // Otherwise lets break some stuff.
spawn(1)
command_announcement.Announce("Dangerous power spike detected in the power network. Please check machinery \
for electrical damage.",
"Critical Power Overload")
var/i = 0
var/limit = rand(30, 50)
for(var/obj/machinery/power/P in powernet_union)
P.overload(src)
i++
if(i % 5)
sleep(1)
if(i >= limit)
break
+4 -20
View File
@@ -73,26 +73,17 @@
new_sound = 'sound/AI/poweroff.ogg')
power_failing = TRUE
if(powernet)
for(var/obj/machinery/power/terminal/T in powernet.nodes) // SMESes that are "downstream" of the powernet.
for(var/obj/machinery/power/terminal/T in powernet.nodes) // APCs that are "downstream" of the powernet.
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = T.master
if(A.is_critical)
continue
A.grid_check = TRUE
A.do_grid_check()
for(var/obj/machinery/power/smes/smes in powernet.nodes) // These are "upstream"
smes.grid_check = TRUE
/*
smes.last_charge = smes.charge
smes.last_output_attempt = smes.output_attempt
smes.last_input_attempt = smes.input_attempt
smes.charge = 0
smes.inputting(FALSE)
smes.outputting(FALSE)
smes.update_icon()
smes.power_change()
*/
smes.do_grid_check()
update_icon()
spawn(rand(4 MINUTES, 10 MINUTES) )
@@ -116,10 +107,3 @@
for(var/obj/machinery/power/smes/smes in powernet.nodes) // These are "upstream"
smes.grid_check = FALSE
/*
smes.charge = smes.last_charge
smes.output_attempt = smes.last_output_attempt
smes.input_attempt = smes.last_input_attempt
smes.update_icon()
smes.power_change()
*/
+5 -17
View File
@@ -142,24 +142,12 @@
/obj/machinery/power/proc/overload(var/obj/machinery/power/source)
return
// Used by the grid checker upon receiving a power spike.
/obj/machinery/power/proc/do_grid_check()
return
/obj/machinery/power/proc/power_spike()
var/obj/machinery/power/grid_checker/G = locate() in powernet.nodes
if(G) // If we found a grid checker, then all is well.
G.power_failure(prob(30))
else // Otherwise lets break some stuff.
spawn(1)
command_announcement.Announce("Dangerous power spike detected in the power network. Please check machinery \
for electrical damage.",
"Critical Power Overload")
var/i = 0
var/limit = rand(30, 50)
for(var/obj/machinery/power/P in powernet.nodes)
P.overload(src)
i++
if(i % 5)
sleep(1)
if(i >= limit)
break
return
///////////////////////////////////////////
// Powernet handling helpers
-6
View File
@@ -421,12 +421,6 @@
update_icon()
..()
/obj/machinery/power/smes/overload(var/obj/machinery/power/source) // This propagates the power spike down the powernet.
if(istype(source, /obj/machinery/power/smes)) // Prevent infinite loops if two SMESes are hooked up to each other.
return
power_spike()
/obj/machinery/power/smes/magical
name = "magical power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power."
+52
View File
@@ -53,6 +53,58 @@
-->
<div class="commit sansserif">
<h2 class="date">25 October 2016</h2>
<h3 class="author">Anewbe updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The effects from empty-handed disarming now have a cooldown.</li>
<li class="rscdel">HoS and Detective equipment is less protective.</li>
</ul>
<h2 class="date">24 October 2016</h2>
<h3 class="author">Anewbe updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The color selectable beret should now be more vibrantly colored.</li>
<li class="rscadd">Bullet armor has a higher chance of preventing an embed.</li>
<li class="tweak">The actual system by which embed works has been changed. The overall effect should be negligible.</li>
<li class="tweak">Flashlights use device cells. Time of use should be roughly unchanged.</li>
<li class="rscadd">Device cells have a chance to spawn where normal cells do.</li>
<li class="rscadd">Internal Affairs Agent HUD icon added.</li>
<li class="tweak">Command, QM, and Bridge Secretary icons are now blue.</li>
<li class="tweak">Research department icons are now purple.</li>
<li class="tweak">Supply department icons are now brown.</li>
<li class="tweak">Chemist icon is now white and red, like the rest of medical.</li>
<li class="tweak">Using a roll of tape on a person requires the same level of grip as handcuffs.</li>
</ul>
<h3 class="author">MagmaRam updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Rates of blood loss now depend on the type of wound inflicted and where the wound is inflicted, as well as the damage.</li>
</ul>
<h3 class="author">Anewbe updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The disclocation chance when using disarm intent with a weapon has had its' formula changed, meaning the threshold for always disclocatiing is now higher, and no longer 15 force. Meaning weapons will dislocate limbs less often and will also do less damage.</li>
</ul>
<h3 class="author">Neerti updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Changes how the grid check event works. A new machine called the grid checker exists in engineering, near the engineering substation. The actual event now involves a power spike originating from the engine, which the grid checker will activate upon sensing it, and causing a blackout. Engineering can restore power faster if they hack the grid checker correctly. A piece of paper left in the substation has more details.</li>
<li class="rscadd">Adds new 'spell power' mechanic, currently tied to technomancer cores. Certain cores will augment various characteristics of spells, such as damage, radius, etc Base spell power is 100% (internally 1.0) and some cores may raise or lower it.</li>
<li class="rscadd">Adds new 'info' tab for Technomancers that hopefully tells new them what they need to know.</li>
<li class="tweak">Round-end now shows every spell each technomancer has, as well as their core type.</li>
<li class="tweak">Ability HUD buttons can be re-ordered by clickdragging one button onto another.</li>
<li class="bugfix">Recycling core now actually works.</li>
<li class="rscadd">Adds two new cores. The Safety Core, which reduces instability by 70%, however it hass less energy, lower recharge rate and lower spell power. Also the Overcharged Core which uses more energy, caused more instability, but has far higher spell potency.</li>
<li class="rscadd">Adds a new Spyglass item, that functions exactly like a pair of binoculars. This is for Techomancers.</li>
<li class="tweak">Technomancer Resurrect now has a deadline of 30 minutes until a dead person can't be revived, instead of 10 minutes.</li>
<li class="tweak">Technomancer Radiance is now three times as strong. Also Radiance with a Scepter prevents the caster and allies from being afflicted.</li>
</ul>
<h3 class="author">PapaDrow updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Striped undergarments now exist.</li>
</ul>
<h3 class="author">Redstryker updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a blue variant of the Medical voidsuit called the 'Emergency Medical Response Voidsuit' that can be obtained from the suit cycler.</li>
</ul>
<h2 class="date">10 October 2016</h2>
<h3 class="author">Anewbe updated:</h3>
<ul class="changes bgimages16">
+59
View File
@@ -2956,3 +2956,62 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: Low Yield EMP grenades now have the proper EMP radii.
Redstryker:
- bugfix: Allows promotion to Colony Director on the ID console.
2016-10-24:
Anewbe:
- tweak: The color selectable beret should now be more vibrantly colored.
- rscadd: Bullet armor has a higher chance of preventing an embed.
- tweak: The actual system by which embed works has been changed. The overall effect
should be negligible.
- tweak: Flashlights use device cells. Time of use should be roughly unchanged.
- rscadd: Device cells have a chance to spawn where normal cells do.
- rscadd: Internal Affairs Agent HUD icon added.
- tweak: Command, QM, and Bridge Secretary icons are now blue.
- tweak: Research department icons are now purple.
- tweak: Supply department icons are now brown.
- tweak: Chemist icon is now white and red, like the rest of medical.
- tweak: Using a roll of tape on a person requires the same level of grip as handcuffs.
MagmaRam:
- tweak: Rates of blood loss now depend on the type of wound inflicted and where
the wound is inflicted, as well as the damage.
Anewbe:
- tweak: The disclocation chance when using disarm intent with a weapon has had
its' formula changed, meaning the threshold for always disclocatiing is now
higher, and no longer 15 force. Meaning weapons will dislocate limbs less often
and will also do less damage.
Neerti:
- tweak: Changes how the grid check event works. A new machine called the grid
checker exists in engineering, near the engineering substation. The actual
event now involves a power spike originating from the engine, which the grid
checker will activate upon sensing it, and causing a blackout. Engineering
can restore power faster if they hack the grid checker correctly. A piece of
paper left in the substation has more details.
- rscadd: Adds new 'spell power' mechanic, currently tied to technomancer cores.
Certain cores will augment various characteristics of spells, such as damage,
radius, etc Base spell power is 100% (internally 1.0) and some cores may raise
or lower it.
- rscadd: Adds new 'info' tab for Technomancers that hopefully tells new them what
they need to know.
- tweak: Round-end now shows every spell each technomancer has, as well as their
core type.
- tweak: Ability HUD buttons can be re-ordered by clickdragging one button onto
another.
- bugfix: Recycling core now actually works.
- rscadd: Adds two new cores. The Safety Core, which reduces instability by 70%,
however it hass less energy, lower recharge rate and lower spell power. Also
the Overcharged Core which uses more energy, caused more instability, but has
far higher spell potency.
- rscadd: Adds a new Spyglass item, that functions exactly like a pair of binoculars.
This is for Techomancers.
- tweak: Technomancer Resurrect now has a deadline of 30 minutes until a dead person
can't be revived, instead of 10 minutes.
- tweak: Technomancer Radiance is now three times as strong. Also Radiance with
a Scepter prevents the caster and allies from being afflicted.
PapaDrow:
- rscadd: Striped undergarments now exist.
Redstryker:
- rscadd: Added a blue variant of the Medical voidsuit called the 'Emergency Medical
Response Voidsuit' that can be obtained from the suit cycler.
2016-10-25:
Anewbe:
- tweak: The effects from empty-handed disarming now have a cooldown.
- rscdel: HoS and Detective equipment is less protective.
-37
View File
@@ -1,37 +0,0 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Anewbe
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Bullet armor has a higher chance of preventing an embed."
- tweak: "The actual system by which embed works has been changed. The overall effect should be negligible."
@@ -1,37 +0,0 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Anewbe
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- tweak: "Flashlights use device cells. Time of use should be roughly unchanged."
- rscadd: "Device cells have a chance to spawn where normal cells do."

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