Merge branch 'dev' into ofChemistryAndStuff

Conflicts:
	maps/exodus-1.dmm
This commit is contained in:
Kelenius
2015-03-30 10:35:37 +03:00
11 changed files with 2315 additions and 2294 deletions

View File

@@ -58,7 +58,7 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
C.setViewRange(new_range) C.setViewRange(new_range)
if(CAMERA_WIRE_POWER) if(CAMERA_WIRE_POWER)
C.deactivate(null) // Deactivate the camera C.kick_viewers() // Kicks anyone watching the camera
if(CAMERA_WIRE_LIGHT) if(CAMERA_WIRE_LIGHT)
C.light_disabled = !C.light_disabled C.light_disabled = !C.light_disabled

View File

@@ -1,7 +1,13 @@
proc/log_and_message_admins(var/message as text) proc/log_and_message_admins(var/message as text)
log_admin(usr ? "[usr]([usr.ckey]) [message]" : "EVENT [message]") log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[usr]([usr.ckey]) [message]" : "EVENT [message]") message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
proc/admin_log_and_message_admins(var/message as text) proc/admin_log_and_message_admins(var/message as text)
log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]") log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]", 1) message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1)
proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message)
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[victim_message] [key_name(attacker)]</font>")
attacker.attack_log += text("\[[time_stamp()]\] <font color='red'>[attacker_message] [key_name(victim)]</font>")
msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[attacker.x];Y=[attacker.y];Z=[attacker.z]'>JMP</a>)")

View File

@@ -37,6 +37,10 @@ var/const/HOLOPAD_MODE = RANGE_BASED
icon_state = "holopad0" icon_state = "holopad0"
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
var/power_per_hologram = 500 //per usage per hologram
idle_power_usage = 5
use_power = 1
var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad
var/last_request = 0 //to prevent request spam. ~Carn var/last_request = 0 //to prevent request spam. ~Carn
@@ -122,7 +126,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
SetLuminosity(2) //pad lighting SetLuminosity(2) //pad lighting
icon_state = "holopad1" icon_state = "holopad1"
A.holo = src A.holo = src
use_power += HOLOGRAM_POWER_USAGE
return 1 return 1
/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user) /obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user)
@@ -130,29 +133,31 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
user.holo = null user.holo = null
del(masters[user])//Get rid of user's hologram //qdel del(masters[user])//Get rid of user's hologram //qdel
masters -= user //Discard AI from the list of those who use holopad masters -= user //Discard AI from the list of those who use holopad
use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage
if (!masters.len)//If no users left if (!masters.len)//If no users left
SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
icon_state = "holopad0" icon_state = "holopad0"
use_power = HOLOPAD_PASSIVE_POWER_USAGE
return 1 return 1
/obj/machinery/hologram/holopad/process() /obj/machinery/hologram/holopad/process()
for (var/mob/living/silicon/ai/master in masters) for (var/mob/living/silicon/ai/master in masters)
if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. var/active_ai = (master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
if(!(stat & NOPOWER))//If the machine has power. if((stat & NOPOWER) || !active_ai)
if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) <= holo_range))) clear_holo(master)
return 1 continue
if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range)))
clear_holo(master)
continue
if(HOLOPAD_MODE == AREA_BASED)
var/area/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj)
if(!(eye_area in holo_area.master.related))
clear_holo(master)
continue
else if (HOLOPAD_MODE == AREA_BASED) use_power(power_per_hologram)
var/area/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj)
if(eye_area in holo_area.master.related)
return 1
clear_holo(master)//If not, we want to get rid of the hologram.
return 1 return 1
/obj/machinery/hologram/holopad/proc/move_hologram(mob/living/silicon/ai/user) /obj/machinery/hologram/holopad/proc/move_hologram(mob/living/silicon/ai/user)

View File

@@ -6,6 +6,7 @@
slot = "utility" slot = "utility"
var/slots = 3 var/slots = 3
var/obj/item/weapon/storage/internal/hold var/obj/item/weapon/storage/internal/hold
w_class = 3.0
/obj/item/clothing/accessory/storage/New() /obj/item/clothing/accessory/storage/New()
..() ..()
@@ -48,7 +49,7 @@
/obj/item/clothing/accessory/storage/webbing /obj/item/clothing/accessory/storage/webbing
name = "webbing" name = "webbing"
desc = "Strudy mess of synthcotton belts and buckles, ready to share your burden." desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
icon_state = "webbing" icon_state = "webbing"
item_color = "webbing" item_color = "webbing"
@@ -83,4 +84,4 @@
/obj/item/weapon/kitchenknife/ritual) /obj/item/weapon/kitchenknife/ritual)
new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold)

View File

@@ -28,7 +28,7 @@ var/global/list/holodeck_programs = list(
var/area/linkedholodeck = null var/area/linkedholodeck = null
var/area/target = null var/area/target = null
var/active = 0 var/active = 0
var/list/holographic_items = list() var/list/holographic_objs = list()
var/list/holographic_mobs = list() var/list/holographic_mobs = list()
var/damaged = 0 var/damaged = 0
var/safety_disabled = 0 var/safety_disabled = 0
@@ -208,7 +208,7 @@ var/global/list/holodeck_programs = list(
emergencyShutdown() emergencyShutdown()
/obj/machinery/computer/HolodeckControl/process() /obj/machinery/computer/HolodeckControl/process()
for(var/item in holographic_items) // do this first, to make sure people don't take items out when power is down. for(var/item in holographic_objs) // do this first, to make sure people don't take items out when power is down.
if(!(get_turf(item) in linkedholodeck)) if(!(get_turf(item) in linkedholodeck))
derez(item, 0) derez(item, 0)
@@ -221,7 +221,7 @@ var/global/list/holodeck_programs = list(
if(!..()) if(!..())
return return
if(active) if(active)
use_power(item_power_usage * (holographic_items.len + holographic_mobs.len)) use_power(item_power_usage * (holographic_objs.len + holographic_mobs.len))
if(!checkInteg(linkedholodeck)) if(!checkInteg(linkedholodeck))
damaged = 1 damaged = 1
@@ -243,7 +243,7 @@ var/global/list/holodeck_programs = list(
T.hotspot_expose(1000,500,1) T.hotspot_expose(1000,500,1)
/obj/machinery/computer/HolodeckControl/proc/derez(var/obj/obj , var/silent = 1) /obj/machinery/computer/HolodeckControl/proc/derez(var/obj/obj , var/silent = 1)
holographic_items.Remove(obj) holographic_objs.Remove(obj)
if(obj == null) if(obj == null)
return return
@@ -271,7 +271,7 @@ var/global/list/holodeck_programs = list(
if(toggleOn) if(toggleOn)
var/area/targetsource = locate(/area/holodeck/source_emptycourt) var/area/targetsource = locate(/area/holodeck/source_emptycourt)
holographic_items = targetsource.copy_contents_to(linkedholodeck) holographic_objs = targetsource.copy_contents_to(linkedholodeck)
spawn(30) spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck) for(var/obj/effect/landmark/L in linkedholodeck)
@@ -288,7 +288,7 @@ var/global/list/holodeck_programs = list(
active = 1 active = 1
use_power = 2 use_power = 2
else else
for(var/item in holographic_items) for(var/item in holographic_objs)
derez(item) derez(item)
if(!linkedholodeck.has_gravity) if(!linkedholodeck.has_gravity)
linkedholodeck.gravitychange(1,linkedholodeck) linkedholodeck.gravitychange(1,linkedholodeck)
@@ -313,7 +313,7 @@ var/global/list/holodeck_programs = list(
active = 1 active = 1
use_power = 2 use_power = 2
for(var/item in holographic_items) for(var/item in holographic_objs)
derez(item) derez(item)
for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
@@ -323,7 +323,9 @@ var/global/list/holodeck_programs = list(
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
del(B) del(B)
holographic_items = A.copy_contents_to(linkedholodeck , 1) holographic_objs = A.copy_contents_to(linkedholodeck , 1)
for(var/obj/holo_obj in holographic_objs)
holo_obj.alpha *= 0.8 //give holodeck objs a slight transparency
spawn(30) spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck) for(var/obj/effect/landmark/L in linkedholodeck)
@@ -366,7 +368,7 @@ var/global/list/holodeck_programs = list(
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown() /obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
//Get rid of any items //Get rid of any items
for(var/item in holographic_items) for(var/item in holographic_objs)
derez(item) derez(item)
for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
holographic_mobs -= C holographic_mobs -= C

View File

@@ -392,10 +392,15 @@
icon_state = "holo4" icon_state = "holo4"
icon_living = "holo4" icon_living = "holo4"
icon_dead = "holo4" icon_dead = "holo4"
alpha = 127
icon_gib = null icon_gib = null
meat_amount = 0 meat_amount = 0
meat_type = null meat_type = null
/mob/living/simple_animal/hostile/carp/holodeck/New()
..()
SetLuminosity(2) //hologram lighting
/mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe) /mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe)
if (safe) if (safe)
faction = "neutral" faction = "neutral"

View File

@@ -39,4 +39,5 @@ var/global/list/empty_playable_ai_cores = list()
clear_antag_roles(mind) clear_antag_roles(mind)
del(src) ghostize(0)
del(src)

View File

@@ -189,7 +189,7 @@
icon_state = "pill8" icon_state = "pill8"
New() New()
..() ..()
reagents.add_reagent("dexalin", 15) reagents.add_reagent("dexalinp", 15)
/obj/item/weapon/reagent_containers/pill/dermaline /obj/item/weapon/reagent_containers/pill/dermaline
name = "Dermaline pill" name = "Dermaline pill"

View File

@@ -1,114 +1,116 @@
/obj/effect/proc_holder/spell/targeted/mind_transfer /obj/effect/proc_holder/spell/targeted/mind_transfer
name = "Mind Transfer" name = "Mind Transfer"
desc = "This spell allows the user to switch bodies with a target." desc = "This spell allows the user to switch bodies with a target."
school = "transmutation" school = "transmutation"
charge_max = 600 charge_max = 600
clothes_req = 0 clothes_req = 0
invocation = "GIN'YU CAPAN" invocation = "GIN'YU CAPAN"
invocation_type = "whisper" invocation_type = "whisper"
range = 1 range = 1
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
var/list/compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk var/list/compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included) var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell
var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell
var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell
/* /*
Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do. Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do.
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
Also, you never added distance checking after target is selected. I've went ahead and did that. Also, you never added distance checking after target is selected. I've went ahead and did that.
*/ */
/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) /obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr)
if(!targets.len) if(!targets.len)
user << "No mind found." user << "No mind found."
return return
if(targets.len > 1) if(targets.len > 1)
user << "Too many minds! You're not a hive damnit!"//Whaa...aat? user << "Too many minds! You're not a hive damnit!"//Whaa...aat?
return return
var/mob/living/target = targets[1] var/mob/living/target = targets[1]
if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
user << "They are too far away!" user << "They are too far away!"
return return
if(!(target.type in compatible_mobs)) if(!(target.type in compatible_mobs))
user << "Their mind isn't compatible with yours." user << "Their mind isn't compatible with yours."
return return
if(target.stat == DEAD) if(target.stat == DEAD)
user << "You didn't study necromancy back at the Space Wizard Federation academy." user << "You didn't study necromancy back at the Space Wizard Federation academy."
return return
if(!target.key || !target.mind) if(!target.key || !target.mind)
user << "They appear to be catatonic. Not even magic can affect their vacant mind." user << "They appear to be catatonic. Not even magic can affect their vacant mind."
return return
if(target.mind.special_role in protected_roles) if(target.mind.special_role in protected_roles)
user << "Their mind is resisting your spell." user << "Their mind is resisting your spell."
return return
var/mob/living/victim = target//The target of the spell whos body will be transferred to. var/mob/living/victim = target//The target of the spell whos body will be transferred to.
var/mob/caster = user//The wizard/whomever doing the body transferring. var/mob/caster = user//The wizard/whomever doing the body transferring.
//SPELL LOSS BEGIN //SPELL LOSS BEGIN
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost. admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on")
var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
var/list/checked_spells = user.spell_list //NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
checked_spells -= m_transfer //Remove Mind Transfer from the list. var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
var/list/checked_spells = user.spell_list
if(caster.spell_list.len)//If they have any spells left over after mind transfer is taken out. If they don't, we don't need this. checked_spells -= m_transfer //Remove Mind Transfer from the list.
for(var/i=spell_loss_amount,(i>0&&checked_spells.len),i--)//While spell loss amount is greater than zero and checked_spells has spells in it, run this proc.
for(var/j=checked_spells.len,(j>0&&checked_spells.len),j--)//While the spell list to check is greater than zero and has spells in it, run this proc. if(caster.spell_list.len)//If they have any spells left over after mind transfer is taken out. If they don't, we don't need this.
if(prob(base_spell_loss_chance)) for(var/i=spell_loss_amount,(i>0&&checked_spells.len),i--)//While spell loss amount is greater than zero and checked_spells has spells in it, run this proc.
checked_spells -= pick(checked_spells)//Pick a random spell to remove. for(var/j=checked_spells.len,(j>0&&checked_spells.len),j--)//While the spell list to check is greater than zero and has spells in it, run this proc.
spawn(msg_wait) if(prob(base_spell_loss_chance))
victim << "The mind transfer has robbed you of a spell." checked_spells -= pick(checked_spells)//Pick a random spell to remove.
break//Spell lost. Break loop, going back to the previous for() statement. spawn(msg_wait)
else//Or keep checking, adding spell chance modifier to increase chance of losing a spell. victim << "The mind transfer has robbed you of a spell."
base_spell_loss_chance += spell_loss_chance_modifier break//Spell lost. Break loop, going back to the previous for() statement.
else//Or keep checking, adding spell chance modifier to increase chance of losing a spell.
checked_spells += m_transfer//Add back Mind Transfer. base_spell_loss_chance += spell_loss_chance_modifier
user.spell_list = checked_spells//Set user spell list to whatever the new list is.
//SPELL LOSS END checked_spells += m_transfer//Add back Mind Transfer.
user.spell_list = checked_spells//Set user spell list to whatever the new list is.
//MIND TRANSFER BEGIN //SPELL LOSS END
if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list.
for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. //MIND TRANSFER BEGIN
caster.verbs -= V//But a safety nontheless. if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list.
for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot.
if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. caster.verbs -= V//But a safety nontheless.
for(var/V in victim.mind.special_verbs)
victim.verbs -= V if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs.
for(var/V in victim.mind.special_verbs)
var/mob/dead/observer/ghost = victim.ghostize(0) victim.verbs -= V
ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
var/mob/dead/observer/ghost = victim.ghostize(0)
caster.mind.transfer_to(victim) ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
victim.spell_list = caster.spell_list//Now they are inside the victim's body.
caster.mind.transfer_to(victim)
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. victim.spell_list = caster.spell_list//Now they are inside the victim's body.
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
caster.verbs += V if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
ghost.mind.transfer_to(caster) caster.verbs += V
caster.key = ghost.key //have to transfer the key since the mind was not active
caster.spell_list = ghost.spell_list ghost.mind.transfer_to(caster)
caster.key = ghost.key //have to transfer the key since the mind was not active
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. caster.spell_list = ghost.spell_list
for(var/V in caster.mind.special_verbs)
caster.verbs += V if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
//MIND TRANSFER END for(var/V in caster.mind.special_verbs)
caster.verbs += V
//Here we paralyze both mobs and knock them out for a time. //MIND TRANSFER END
caster.Paralyse(paralysis_amount_caster)
victim.Paralyse(paralysis_amount_victim) //Here we paralyze both mobs and knock them out for a time.
caster.Paralyse(paralysis_amount_caster)
//After a certain amount of time the victim gets a message about being in a different body. victim.Paralyse(paralysis_amount_victim)
spawn(msg_wait)
caster << "\red You feel woozy and lightheaded. <b>Your body doesn't seem like your own.</b>" //After a certain amount of time the victim gets a message about being in a different body.
spawn(msg_wait)
caster << "\red You feel woozy and lightheaded. <b>Your body doesn't seem like your own.</b>"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

After

Width:  |  Height:  |  Size: 253 KiB

File diff suppressed because it is too large Load Diff