mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
Framework for nerfing emags flexibly.
Tested locally.
This commit is contained in:
@@ -147,6 +147,11 @@
|
|||||||
var/assistantlimit = 0 //enables assistant limiting
|
var/assistantlimit = 0 //enables assistant limiting
|
||||||
var/assistantratio = 2 //how many assistants to security members
|
var/assistantratio = 2 //how many assistants to security members
|
||||||
|
|
||||||
|
var/emag_energy = -1
|
||||||
|
var/emag_starts_charged = 1
|
||||||
|
var/emag_recharge_rate = 0
|
||||||
|
var/emag_recharge_ticks = 0
|
||||||
|
|
||||||
/datum/configuration/New()
|
/datum/configuration/New()
|
||||||
. = ..()
|
. = ..()
|
||||||
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
||||||
@@ -544,6 +549,14 @@
|
|||||||
config.limbs_can_break = value
|
config.limbs_can_break = value
|
||||||
if("respawn_delay")
|
if("respawn_delay")
|
||||||
config.respawn_delay = value
|
config.respawn_delay = value
|
||||||
|
if("emag_energy")
|
||||||
|
config.emag_energy = value
|
||||||
|
if("emag_starts_charged")
|
||||||
|
config.emag_starts_charged = value
|
||||||
|
if("emag_recharge_rate")
|
||||||
|
config.emag_recharge_rate = value
|
||||||
|
if("emag_recharge_ticks")
|
||||||
|
config.emag_recharge_ticks = value
|
||||||
else
|
else
|
||||||
diary << "Unknown setting in configuration: '[name]'"
|
diary << "Unknown setting in configuration: '[name]'"
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,8 @@
|
|||||||
autoclose = 1
|
autoclose = 1
|
||||||
var/busy = 0
|
var/busy = 0
|
||||||
|
|
||||||
|
emag_cost = 1 // in MJ
|
||||||
|
|
||||||
/obj/machinery/door/airlock/Destroy()
|
/obj/machinery/door/airlock/Destroy()
|
||||||
if(wires)
|
if(wires)
|
||||||
wires.Destroy()
|
wires.Destroy()
|
||||||
@@ -105,6 +107,7 @@
|
|||||||
name = "Vault"
|
name = "Vault"
|
||||||
icon = 'icons/obj/doors/vault.dmi'
|
icon = 'icons/obj/doors/vault.dmi'
|
||||||
opacity = 1
|
opacity = 1
|
||||||
|
emag_cost = 2 // in MJ
|
||||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
|
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
|
||||||
|
|
||||||
/obj/machinery/door/airlock/freezer
|
/obj/machinery/door/airlock/freezer
|
||||||
@@ -284,6 +287,7 @@
|
|||||||
name = "High Tech Security Airlock"
|
name = "High Tech Security Airlock"
|
||||||
icon = 'icons/obj/doors/hightechsecurity.dmi'
|
icon = 'icons/obj/doors/hightechsecurity.dmi'
|
||||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
|
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
|
||||||
|
emag_cost = 2 // in MJ
|
||||||
|
|
||||||
/*
|
/*
|
||||||
About the new airlock wires panel:
|
About the new airlock wires panel:
|
||||||
|
|||||||
@@ -116,7 +116,15 @@ Class Procs:
|
|||||||
var/custom_aghost_alerts=0
|
var/custom_aghost_alerts=0
|
||||||
var/panel_open = 0
|
var/panel_open = 0
|
||||||
|
|
||||||
var/machine_flags = 0//this is what you use for flags.
|
/**
|
||||||
|
* Machine construction/destruction/emag flags.
|
||||||
|
*/
|
||||||
|
var/machine_flags = 0 // This is what you use for flags.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emag energy cost.
|
||||||
|
*/
|
||||||
|
var/emag_cost = 0 // Emag energy cost.
|
||||||
|
|
||||||
var/inMachineList = 1 // For debugging.
|
var/inMachineList = 1 // For debugging.
|
||||||
|
|
||||||
@@ -447,29 +455,49 @@ Class Procs:
|
|||||||
return 1
|
return 1
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle emags.
|
||||||
|
* @param user /mob The mob that used the emag.
|
||||||
|
*/
|
||||||
/obj/machinery/proc/emag(mob/user as mob)
|
/obj/machinery/proc/emag(mob/user as mob)
|
||||||
return
|
// Disable emaggability.
|
||||||
|
machine_flags &= ~EMAGGABLE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the cost of emagging this machine (emag_cost by default)
|
||||||
|
* @param user /mob The mob that used the emag.
|
||||||
|
* @param emag /obj/item/weapon/card/emag The emag used on this device.
|
||||||
|
* @return number Cost to emag.
|
||||||
|
*/
|
||||||
|
/obj/machinery/proc/getEmagCost(var/mob/user, var/obj/item/weapon/card/emag/emag)
|
||||||
|
return emag_cost
|
||||||
|
|
||||||
/obj/machinery/attackby(var/obj/O, var/mob/user)
|
/obj/machinery/attackby(var/obj/O, var/mob/user)
|
||||||
if(istype(O, /obj/item/weapon/card/emag) && machine_flags &EMAGGABLE)
|
if(istype(O, /obj/item/weapon/card/emag) && machine_flags & EMAGGABLE)
|
||||||
emag(user)
|
var/obj/item/weapon/card/emag/E = O
|
||||||
return
|
if(E.canUse(user,src))
|
||||||
if(istype(O, /obj/item/weapon/wrench) && machine_flags &WRENCHMOVE) //make sure this is BEFORE the fixed2work check
|
emag(user)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(istype(O, /obj/item/weapon/wrench) && machine_flags & WRENCHMOVE) //make sure this is BEFORE the fixed2work check
|
||||||
if(!panel_open)
|
if(!panel_open)
|
||||||
return wrenchAnchor(user)
|
return wrenchAnchor(user)
|
||||||
else
|
else
|
||||||
user <<"<span class='warning'>\The [src]'s maintenance panel must be closed first!</span>"
|
user <<"<span class='warning'>\The [src]'s maintenance panel must be closed first!</span>"
|
||||||
return -1 //we return -1 rather than 0 for the if(..()) checks
|
return -1 //we return -1 rather than 0 for the if(..()) checks
|
||||||
if(istype(O, /obj/item/weapon/screwdriver) && machine_flags &SCREWTOGGLE)
|
|
||||||
|
if(istype(O, /obj/item/weapon/screwdriver) && machine_flags & SCREWTOGGLE)
|
||||||
return togglePanelOpen(O, user)
|
return togglePanelOpen(O, user)
|
||||||
if(istype(O, /obj/item/weapon/crowbar) && machine_flags &CROWDESTROY)
|
|
||||||
|
if(istype(O, /obj/item/weapon/crowbar) && machine_flags & CROWDESTROY)
|
||||||
if(panel_open)
|
if(panel_open)
|
||||||
if(crowbarDestroy(user) == 1)
|
if(crowbarDestroy(user) == 1)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return -1
|
return -1
|
||||||
if(!anchored && machine_flags &FIXED2WORK)
|
|
||||||
|
if(!anchored && machine_flags & FIXED2WORK)
|
||||||
return user << "<span class='warning'>\The [src] must be anchored first!</span>"
|
return user << "<span class='warning'>\The [src] must be anchored first!</span>"
|
||||||
|
|
||||||
/obj/machinery/proc/shock(mob/user, prb, var/siemenspassed = -1)
|
/obj/machinery/proc/shock(mob/user, prb, var/siemenspassed = -1)
|
||||||
@@ -485,4 +513,4 @@ Class Procs:
|
|||||||
if (electrocute_mob(user, get_area(src), src, siemenspassed))
|
if (electrocute_mob(user, get_area(src), src, siemenspassed))
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return -1
|
return -1
|
||||||
|
|||||||
@@ -60,7 +60,99 @@
|
|||||||
icon_state = "emag"
|
icon_state = "emag"
|
||||||
item_state = "card-id"
|
item_state = "card-id"
|
||||||
origin_tech = "magnets=2;syndicate=2"
|
origin_tech = "magnets=2;syndicate=2"
|
||||||
var/uses = 10
|
|
||||||
|
/**
|
||||||
|
* Number of uses left. -1 = infinite
|
||||||
|
* (Note: Some devices can use more than 1 use, so this is just called "energy")
|
||||||
|
* @since 10-28-2014
|
||||||
|
*/
|
||||||
|
var/energy = -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Max energy per emag. -1 = infinite
|
||||||
|
* @since 10-28-2014
|
||||||
|
*/
|
||||||
|
var/max_energy = -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every X ticks, add [recharge_rate] energy.
|
||||||
|
* @since 10-28-2014
|
||||||
|
*/
|
||||||
|
var/recharge_ticks = 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every [recharge_ticks] ticks, add X energy.
|
||||||
|
* @since 10-28-2014
|
||||||
|
*/
|
||||||
|
var/recharge_rate = 0
|
||||||
|
|
||||||
|
var/nticks=0
|
||||||
|
|
||||||
|
/obj/item/weapon/card/emag/New(var/loc, var/disable_tuning=0)
|
||||||
|
..(loc)
|
||||||
|
|
||||||
|
// For standardized subtypes, once they're established.
|
||||||
|
if(disable_tuning)
|
||||||
|
return
|
||||||
|
|
||||||
|
// Tuning tools.
|
||||||
|
//////////////////
|
||||||
|
if(config.emag_energy != -1)
|
||||||
|
max_energy = config.emag_energy
|
||||||
|
|
||||||
|
if(config.emag_starts_charged)
|
||||||
|
energy = max_energy
|
||||||
|
|
||||||
|
if(config.emag_recharge_rate != 0)
|
||||||
|
recharge_rate = config.emag_recharge_rate
|
||||||
|
|
||||||
|
if(config.emag_recharge_ticks > 0)
|
||||||
|
recharge_ticks = config.emag_recharge_ticks
|
||||||
|
|
||||||
|
/obj/item/weapon/card/emag/process()
|
||||||
|
if(energy < max_energy)
|
||||||
|
// Specified number of ticks has passed? Add charge.
|
||||||
|
if(nticks >= recharge_ticks)
|
||||||
|
nticks = 0
|
||||||
|
energy = min(energy + recharge_rate, max_energy)
|
||||||
|
nticks ++
|
||||||
|
else
|
||||||
|
nticks = 0
|
||||||
|
processing_objects.Remove(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/card/emag/proc/canUse(var/mob/user, var/obj/machinery/M)
|
||||||
|
// We've already checked for emaggability. All we do here is check cost.
|
||||||
|
|
||||||
|
// Infinite uses? Just return true.
|
||||||
|
if(energy < 0)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
var/cost=M.getEmagCost(user,src)
|
||||||
|
|
||||||
|
// Free to emag? Return true every time.
|
||||||
|
if(cost == 0)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if(energy >= cost)
|
||||||
|
energy -= cost
|
||||||
|
|
||||||
|
// Start recharging, if we're supposed to.
|
||||||
|
if(energy < max_energy && recharge_rate && recharge_ticks)
|
||||||
|
if(!(src in processing_objects))
|
||||||
|
processing_objects.Add(src)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
/obj/item/weapon/card/emag/examine()
|
||||||
|
..()
|
||||||
|
if(energy==-1)
|
||||||
|
usr << "\The [name] has a tiny fusion generator for power."
|
||||||
|
else
|
||||||
|
usr << "This [name] has [energy]MJ left in its capacitor ([max_energy]MJ capacity)."
|
||||||
|
if(recharge_rate && recharge_ticks)
|
||||||
|
usr << "A small label on a thermocouple notes that it recharges at a rate of [recharge_rate]MJ for every [recharge_ticks>1?"":recharge_ticks] oscillator tick[recharge_ticks>1?"s":""]."
|
||||||
|
|
||||||
/obj/item/weapon/card/id
|
/obj/item/weapon/card/id
|
||||||
name = "identification card"
|
name = "identification card"
|
||||||
|
|||||||
@@ -58,4 +58,24 @@ ANIMAL_DELAY 0
|
|||||||
|
|
||||||
# Define how large an explosion can be.
|
# Define how large an explosion can be.
|
||||||
## DEFAULT: 14
|
## DEFAULT: 14
|
||||||
MAX_EXPLOSION_RANGE 14
|
MAX_EXPLOSION_RANGE 14
|
||||||
|
|
||||||
|
#################
|
||||||
|
### EMAG SHIT ###
|
||||||
|
#################
|
||||||
|
|
||||||
|
# Max energy an emag can hold.
|
||||||
|
## DEFAULT: -1 (infinite)
|
||||||
|
EMAG_ENERGY -1
|
||||||
|
|
||||||
|
# Whether an emag starts charged (1), or uncharged (0).
|
||||||
|
## DEFAULT: 1 (charged)
|
||||||
|
EMAG_STARTS_CHARGED 1
|
||||||
|
|
||||||
|
# Amount of energy to add per recharge cycle.
|
||||||
|
## DEFAULT: 0
|
||||||
|
EMAG_RECHARGE_RATE 0
|
||||||
|
|
||||||
|
# Number of ticks per recharge cycle
|
||||||
|
## DEFAULT: 0 (no recharging)
|
||||||
|
EMAG_RECHARGE_TICKS 0
|
||||||
Reference in New Issue
Block a user