Merge remote-tracking branch 'upstream/dev' into NarsiePort

Conflicts:
	code/modules/projectiles/projectile/change.dm
This commit is contained in:
PsiOmega
2015-03-30 20:17:05 +02:00
12 changed files with 2373 additions and 2338 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

@@ -38,6 +38,10 @@ var/const/HOLOPAD_MODE = RANGE_BASED
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
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
@@ -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
else if (HOLOPAD_MODE == AREA_BASED) 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/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj) var/area/eye_area = get_area(master.eyeobj)
if(eye_area in holo_area.master.related) if(!(eye_area in holo_area.master.related))
return 1 clear_holo(master)
continue
clear_holo(master)//If not, we want to get rid of the hologram. use_power(power_per_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"

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)
ghostize(0)
del(src) del(src)

View File

@@ -6,36 +6,44 @@
nodamage = 1 nodamage = 1
check_armour = "energy" check_armour = "energy"
on_hit(var/atom/change) /obj/item/projectile/change/on_hit(var/atom/change)
wabbajack(change) wabbajack(change)
/obj/item/projectile/change/proc/wabbajack(var/mob/M)
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
if(istype(M, /mob/living) && M.stat != DEAD) if(istype(M, /mob/living) && M.stat != DEAD)
if(M.monkeyizing) return if(M.monkeyizing)
if(M.has_brain_worms()) return //Borer stuff - RR return
if(M.has_brain_worms())
M.monkeyizing = 1 return //Borer stuff - RR
M.canmove = 0
M.icon = null
M.overlays.Cut()
M.invisibility = 101
if(istype(M, /mob/living/silicon/robot)) if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/Robot = M var/mob/living/silicon/robot/Robot = M
if(Robot.mmi) del(Robot.mmi) if(Robot.mmi)
del(Robot.mmi)
else else
for(var/obj/item/W in M) for(var/obj/item/W in M)
if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something
del(W) del(W)
continue continue
W.layer = initial(W.layer) M.drop_from_inventory(W)
W.loc = M.loc
W.dropped(M)
var/mob/living/new_mob var/mob/living/new_mob
var/randomize = pick("robot","slime","xeno","human") var/options = list("robot", "slime")
for(var/t in all_species)
options += t
options -= "Xenomorph Queen"
options -= "Xenomorph"
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species)
options -= H.species.name
else if(isrobot(M))
options -= "robot"
else if(isslime(M))
options -= "slime"
var/randomize = pick(options)
switch(randomize) switch(randomize)
if("robot") if("robot")
new_mob = new /mob/living/silicon/robot(M.loc) new_mob = new /mob/living/silicon/robot(M.loc)
@@ -48,36 +56,42 @@
if("slime") if("slime")
new_mob = new /mob/living/carbon/slime(M.loc) new_mob = new /mob/living/carbon/slime(M.loc)
new_mob.universal_speak = 1 new_mob.universal_speak = 1
if("xeno") else
var/alien_caste = pick("Hunter","Sentinel","Drone","Larva") var/mob/living/carbon/human/H
new_mob = create_new_xenomorph(alien_caste,M.loc) if(ishuman(M))
new_mob.universal_speak = 1 H = M
if("human") else
new_mob = new /mob/living/carbon/human(M.loc, pick(all_species)) new_mob = new /mob/living/carbon/human(M.loc)
H = new_mob
if(M.gender == MALE) if(M.gender == MALE)
new_mob.gender = MALE H.gender = MALE
new_mob.name = pick(first_names_male) H.name = pick(first_names_male)
else else
new_mob.gender = FEMALE H.gender = FEMALE
new_mob.name = pick(first_names_female) H.name = pick(first_names_female)
new_mob.name += " [pick(last_names)]" H.name += " [pick(last_names)]"
new_mob.real_name = new_mob.name H.real_name = H.name
H.set_species(randomize)
H.universal_speak = 1
var/datum/preferences/A = new() //Randomize appearance for the human var/datum/preferences/A = new() //Randomize appearance for the human
A.randomize_appearance_for(new_mob) A.randomize_appearance_for(H)
else
return
if(new_mob)
for (var/obj/effect/proc_holder/spell/S in M.spell_list) for (var/obj/effect/proc_holder/spell/S in M.spell_list)
new_mob.spell_list += new S.type new_mob.spell_list += new S.type
new_mob.a_intent = I_HURT new_mob.a_intent = "hurt"
if(M.mind) if(M.mind)
M.mind.transfer_to(new_mob) M.mind.transfer_to(new_mob)
else else
new_mob.key = M.key new_mob.key = M.key
new_mob << "<B>Your form morphs into that of a [randomize].</B>" new_mob << "<span class='warning'>Your form morphs into that of \a [lowertext(randomize)].</span>"
del(M) del(M)
return new_mob return
else
M << "<span class='warning'>Your form morphs into that of \a [lowertext(randomize)].</span>"
return

View File

@@ -196,7 +196,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

@@ -57,6 +57,8 @@ Also, you never added distance checking after target is selected. I've went ahea
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
admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on")
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost. //NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly. 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 var/list/checked_spells = user.spell_list

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