Skip to content

Commit b8d5428

Browse files
committed
Monolith update
1 parent 4988577 commit b8d5428

File tree

23 files changed

+257
-120
lines changed

23 files changed

+257
-120
lines changed

code/__DEFINES/stalker.dm

+13-7
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
#define ROOKIE 0
1313

1414
///////////////ÐÅÏÓÒÀÖÈß
15-
#define AMAZING 2000
16-
#define VERYGOOD 1500
17-
#define GOOD 1100
18-
#define NEUTRAL 1000
19-
#define BAD 900
15+
#define AMAZING 3000
16+
#define VERYGOOD 2500
17+
#define GOOD 1750
18+
#define NEUTRAL 1500
19+
#define BAD 1250
2020
#define VERYBAD 500
2121
#define DISGUSTING 0
2222

@@ -44,7 +44,8 @@
4444

4545
///////////////SIDORMAT
4646
#define SHOW_FACTION_EQUIPMENT 1
47-
#define SELL_UNBUYABLE 2
47+
#define BUY_STUFF 2
48+
#define SELL_UNBUYABLE 4
4849

4950
///////////////COLOR MATRIXES
5051
#define NIGHTVISION_MATRIX_I list(0.1, 0.9, 0,\
@@ -64,4 +65,9 @@
6465
#define AMBIENT_CAMPFIRE_CHANNEL 712
6566

6667
///////////////GAMEMODES
67-
#define MONOLITH_REVENGER_HOLD_TIME 100
68+
#define MONOLITH_REVENGE_HOLD_TIME 600
69+
70+
///////////////MIND STATE
71+
#define MENTAL_STABLE 0
72+
#define MENTAL_MONOLITH 1
73+
#define MENTAL_ZOMBIE 2

code/game/gamemodes/monolith/monolith_war.dm

+14-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
if(cp.path_ending == "ranger")
2424
cp.controlled_by = "Monolith"
2525
cp.control_percent = 100
26+
for(var/datum/job/J in SSjob.occupations)
27+
if(J.faction_s == "Monolith")
28+
J.activated = 1
2629
return 1
2730

2831
/datum/game_mode/monolith_revenge/post_setup()
@@ -53,21 +56,26 @@
5356
if(antag_base_check)
5457
if((control_table["Monolith"]/cps.len) >= 0.6)
5558
if(winning_faction != "Monolith")
59+
add_lenta_message(null, "0", "Sidorovich", "Loners", "[winning_faction] captured most part of Backwater, they should hold their points for next [round(MONOLITH_REVENGE_HOLD_TIME/600)] minutes!")
5660
winning_faction = "Monolith"
5761
start_hold_time = world.time
5862
else
5963
winning_faction = null
6064
start_hold_time = world.time
6165
else
6266
if(winning_faction != "Stalkers")
67+
add_lenta_message(null, "0", "Sidorovich", "Loners", "[winning_faction] captured most part of Backwater, they should hold their points for next [round(MONOLITH_REVENGE_HOLD_TIME/600)] minutes!")
6368
winning_faction = "Stalkers"
6469
start_hold_time = world.time
6570

66-
if(winning_faction && (start_hold_time + MONOLITH_REVENGER_HOLD_TIME <= world.time))
67-
if(winning_faction == "Monolith")
68-
finished = 1
69-
else
70-
finished = 2
71+
if(winning_faction)
72+
if(world.time >= (start_hold_time + MONOLITH_REVENGE_HOLD_TIME))
73+
if(winning_faction == "Monolith")
74+
finished = 1
75+
else
76+
finished = 2
77+
else if(world.time in (start_hold_time + (MONOLITH_REVENGE_HOLD_TIME/2)) to (start_hold_time + (MONOLITH_REVENGE_HOLD_TIME/2) + world.tick_lag))
78+
add_lenta_message(null, "0", "Sidorovich", "Loners", "[winning_faction] should hold for next [round(MONOLITH_REVENGE_HOLD_TIME/1200)] minutes.")
7179

7280
//////////////////////////////////////
7381
//Checks if the revs have won or not//
@@ -100,6 +108,6 @@
100108
world << "<span class='redtext'>Most of stalker bases were lost, stalkers retreat to the south of Zone.</span>"
101109
else if(finished == 2)
102110
feedback_set_details("round_end_result","is a failure.")
103-
world << "<span class='redtext'>Monolith base lost!</span>"
111+
world << "<span class='redtext'>Monolith base is lost! Monolith forces are leaving Backwater, stalkers reinforce their defences.</span>"
104112
..()
105113
return 1

code/game/stalker/machinery/sidormat.dm

+53-24
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ var/list/global_sidormat_list = list(
121121
new /datum/data/stalker_equipment("Berill-5M", "Áåðèëë-5Ì", /obj/item/clothing/suit/berill, 50000, EXPERIENCED,faction = "Loners"),
122122
new /datum/data/stalker_equipment("Wind of Freedom", "Âåòåð Ñâîáîäû", /obj/item/clothing/suit/hooded/kombez/veter, 25000, ROOKIE, faction = "Freedom"),
123123
new /datum/data/stalker_equipment("Guardian of Freedom", "Ñòðàæ Ñâîáîäû", /obj/item/clothing/suit/strazh, 40000, EXPERIENCED,faction = "Freedom"),
124-
new /datum/data/stalker_equipment("PZ-1 ", "ÏÇ-1", /obj/item/clothing/suit/hooded/kombez/monolith, 25000, ROOKIE, faction = "Monolith"),
124+
new /datum/data/stalker_equipment("PZ-1 ", "ÏÇ-1", /obj/item/clothing/suit/hooded/kombez/monolith, 25000, ROOKIE, faction = "Monolith", sale_price = 8000),
125125
new /datum/data/stalker_equipment("Monolith scientific suit ", "Íàó÷íûé êîìáèíåçîí ìîíîëèòà", /obj/item/clothing/suit/hooded/sealed/monolith, 60000, ROOKIE, faction = "Monolith"),
126126
new /datum/data/stalker_equipment("PS5-M", "ÏÑ5-Ì", /obj/item/clothing/suit/hooded/kombez/ps5m, 25000, ROOKIE, faction = "Duty"),
127127
new /datum/data/stalker_equipment("Heavy merc armor", "Òÿæåëàÿ áðîíÿ íà¸ìíèêîâ", /obj/item/clothing/suit/assaultmerc, 50000, EXPERIENCED,faction = "Mercenaries"),
@@ -175,6 +175,7 @@ var/list/global_sidormat_list = list(
175175

176176
"Misc" = list(
177177
///////////////////////////////// Äðóãîå /////////////////////////////////////////////
178+
new /datum/data/stalker_equipment/stalker_pda("PDA", "ÊÏÊ", /obj/item/device/stalker_pda, 4000, ROOKIE),
178179
new /datum/data/stalker_equipment("Repair-kit for suits and helmets", "Ðåì. êîìïëåêò äë&#x44F; áðîíåêîñòþìîâ è øëåìîâ", /obj/item/device/repair_kit/clothing, 10000, ROOKIE),
179180
new /datum/data/stalker_equipment("Repair-kit for guns", "Ðåì. êîìïëåêò äë&#x44F; îãíåñòðåëüíîãî îðóæè&#x44F;", /obj/item/device/repair_kit/gun, 4000, ROOKIE),
180181
new /datum/data/stalker_equipment("Guitar", "Ãèòàðà", /obj/item/device/instrument/guitar, 3000, ROOKIE),
@@ -258,15 +259,15 @@ var/list/global_sidormat_list = list(
258259
new /datum/data/stalker_equipment("Ñëþäà", "Ñëþäà", /obj/item/weapon/artifact/mica, 30000, ROOKIE, sale_price = 15000),
259260
new /datum/data/stalker_equipment("Ñâåòë&#x44F;ê", "Ñâåòë&#x44F;ê", /obj/item/weapon/artifact/firefly, 60000, ROOKIE, sale_price = 30000),
260261
///////////////////////////////// Ìóñîð //////////////////////////////////////////////
261-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva, 400, ROOKIE),
262-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/MREkonserva1, 200, ROOKIE),
263-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/MREkonserva2, 200, ROOKIE),
264-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/MREkonserva3, 200, ROOKIE),
265-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/bobi, 400, ROOKIE),
266-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/fish, 500, ROOKIE),
267-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/govyadina, 400, ROOKIE),
268-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/shproti, 600, ROOKIE),
269-
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâåà", /obj/item/trash/konserva/soup, 500, ROOKIE),
262+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva, 400, ROOKIE),
263+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/MREkonserva1, 200, ROOKIE),
264+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/MREkonserva2, 200, ROOKIE),
265+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/MREkonserva3, 200, ROOKIE),
266+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/bobi, 400, ROOKIE),
267+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/fish, 500, ROOKIE),
268+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/govyadina, 400, ROOKIE),
269+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/shproti, 600, ROOKIE),
270+
new /datum/data/stalker_equipment("Konserva", "Êîíñåðâà", /obj/item/trash/konserva/soup, 500, ROOKIE),
270271
///////////////////////////////////////////////////////////////////////////////////////////
271272
new /datum/data/stalker_equipment("50 RU", "50 RU", /obj/item/stack/spacecash/c50, 50, ROOKIE, sale_price = 50),
272273
new /datum/data/stalker_equipment("100 RU", "100 RU", /obj/item/stack/spacecash/c100, 100, ROOKIE, sale_price = 100),
@@ -289,7 +290,7 @@ var/list/global_sidormat_list = list(
289290
var/itemloc2 = null
290291
var/balance = 0
291292
var/rating = 0
292-
var/switches = 0
293+
var/switches = BUY_STUFF
293294
var/real_assorment = list()
294295
var/list/special_factions = list("Loners", "Bandits")
295296
var/path_ending = null
@@ -332,6 +333,34 @@ var/list/global_sidormat_list = list(
332333
high_tier_sidormatitems += src
333334
real_sidormat_items += src
334335

336+
/datum/data/stalker_equipment/proc/GetCost()
337+
return src.sale_price
338+
339+
/datum/data/stalker_equipment/stalker_pda/GetCost(var/obj/item/device/stalker_pda/KPK)
340+
var/cost_ = src.sale_price
341+
if(KPK.owner && (KPK.owner.stat == DEAD))
342+
var/rank_ = Clamp(KPK.profile.fields["rating"], ROOKIE, ZONE_LEGEND)
343+
cost_ += GetCostBasedOnReputation(KPK.profile.fields["reputation"])
344+
cost_ += rank_*2
345+
return cost_
346+
347+
/proc/GetCostBasedOnReputation(var/rep_)
348+
switch(rep_)
349+
if(AMAZING to INFINITY)
350+
return ((NEUTRAL - rep_) * 20)
351+
if(VERYGOOD to AMAZING)
352+
return ((NEUTRAL - rep_) * 10)
353+
if(GOOD to VERYGOOD)
354+
return ((NEUTRAL - rep_) * 5)
355+
if(BAD to GOOD)
356+
return 0
357+
if(VERYBAD to BAD)
358+
return ((NEUTRAL - rep_) * 5)
359+
if(DISGUSTING to VERYBAD)
360+
return ((NEUTRAL - rep_) * 10)
361+
if(-INFINITY to DISGUSTING)
362+
return ((NEUTRAL - rep_) * 20)
363+
335364
/obj/machinery/stalker/sidormat/New()
336365
itemloc = locate(x - 1, y, z)
337366
itemloc2 = locate(x + 1, y, z)
@@ -386,7 +415,7 @@ var/list/global_sidormat_list = list(
386415
dat +="<div class='statusDisplay'>"
387416
dat += "Balance: [num2text(balance, 8)] RU<br>"
388417
dat += "<br><br>INSTRUCTION: Put habar for sale on the <b>left</b> table.<br>" // Çàáèðàòü äåíüãè è êóïëåííûå âåùè - íà <b>ïðàâîì</b>.
389-
if(!(switches & SHOW_FACTION_EQUIPMENT))
418+
if(!(switches & BUY_STUFF))
390419
dat +="<A href='?src=\ref[src];choice=take'><b>Sell habar</b></A><br>"
391420
if(door_device && sk.fields["degree"])
392421
dat +="<A href='?src=\ref[src];basement_toggle=1'><b>Toggle basement door</b></A><br>"
@@ -398,7 +427,7 @@ var/list/global_sidormat_list = list(
398427
continue
399428
dat += "<tr><td><center><big><b>[L]</b></big></center></td><td></td><td></td></tr>"
400429
for(var/datum/data/stalker_equipment/prize in global_sidormat_list[L])
401-
if((KPK.eng_faction_s == prize.faction && (KPK.eng_faction_s in special_factions || (switches & SHOW_FACTION_EQUIPMENT))) || prize.faction == "Everyone")
430+
if((sk.fields["faction_s"] == prize.faction && ((sk.fields["faction_s"] in special_factions) || (switches & SHOW_FACTION_EQUIPMENT))) || prize.faction == "Everyone")
402431
//if(rating >= prize.rating)
403432
if(get_assortment_level(H) >= prize.assortment_level)
404433
dat += "<tr><td>[prize.name]</td><td>[prize.cost]</td><td><A href='?src=\ref[src];purchase=\ref[prize]'>Buy</A></td></tr>"
@@ -413,7 +442,7 @@ var/list/global_sidormat_list = list(
413442
dat +="<div class='statusDisplay'>"
414443
dat += "Íà ñ÷åòó: [num2text(balance, 8)] RU<br>"
415444
dat += "<br><br>ÈÍÑÒÐÓÊÖÈß: Õàáàð ñêëàäûâàòü - íà <b>ëåâîì</b> ñòîëå.<br>" //Çàáèðàòü äåíüãè è êóïëåííûå âåùè - íà <b>ïðàâîì</b>.
416-
if(!(switches & SHOW_FACTION_EQUIPMENT))
445+
if(!(switches & BUY_STUFF))
417446
dat +="<A href='?src=\ref[src];choice=take'><b>Ñáûòü õàáàð</b></A><br>"
418447
if(door_device && sk.fields["degree"])
419448
dat +="<A href='?src=\ref[src];basement_toggle=1'><b>Îòêðûòü/Çàêðûòü õðàíèëèùå</b></A><br>"
@@ -425,7 +454,7 @@ var/list/global_sidormat_list = list(
425454
continue
426455
dat += "<tr><td><center><b>[L]</b></center></td><td></td><td></td></tr>"
427456
for(var/datum/data/stalker_equipment/prize in global_sidormat_list[L])
428-
if((KPK.eng_faction_s == prize.faction && (KPK.eng_faction_s in special_factions || (switches & SHOW_FACTION_EQUIPMENT))) || prize.faction == "Everyone")
457+
if((sk.fields["faction_s"] == prize.faction && ((sk.fields["faction_s"] in special_factions) || (switches & SHOW_FACTION_EQUIPMENT))) || prize.faction == "Everyone")
429458
//if(rating >= prize.rating)
430459
if(get_assortment_level(H) >= prize.assortment_level)
431460
dat += "<tr><td>[prize.name_ru]</td><td>[prize.cost]</td><td><A href='?src=\ref[src];purchase=\ref[prize]'>Êóïèòü</A></td></tr>"
@@ -518,7 +547,7 @@ var/list/global_sidormat_list = list(
518547
say("No access.")
519548
return
520549

521-
var/list/ontable = GetItemsOnTable()
550+
var/list/atom/movable/ontable = GetItemsOnTable()
522551
var/total_cost = GetOnTableCost(ontable)
523552

524553
if(total_cost < 100)
@@ -528,10 +557,10 @@ var/list/global_sidormat_list = list(
528557
if(I.loc != itemloc)
529558
continue
530559

531-
sk.fields["money"] += GetCost(I.type)
560+
sk.fields["money"] += GetCost(I)
532561
balance = sk.fields["money"]
533562

534-
say("[I] was sold for [GetCost(I.type)].")
563+
say("[I] was sold for [GetCost(I)].")
535564

536565
PlaceInPool(I)
537566
CHECK_TICK
@@ -545,7 +574,7 @@ var/list/global_sidormat_list = list(
545574
/obj/machinery/stalker/sidormat/proc/GetItemsOnTable()
546575
var/list/ontable = list()
547576
for(var/atom/movable/AM in itemloc)
548-
if(!GetCost(AM.type))
577+
if(GetCost(AM) <= 0)
549578
continue
550579

551580
if(istype(AM, /obj/item/clothing))
@@ -576,16 +605,16 @@ var/list/global_sidormat_list = list(
576605
//var/list/ontable = GetItemsOnTable()
577606
var/total_cost = 0
578607

579-
for(var/atom/item_on_table in ontable)
580-
var/cost = GetCost(item_on_table.type)
608+
for(var/atom/movable/item_on_table in ontable)
609+
var/cost = GetCost(item_on_table)
581610
if(cost)
582611
total_cost += cost
583612
return total_cost
584613

585-
/obj/machinery/stalker/sidormat/proc/GetCost(itemtype)
614+
/obj/machinery/stalker/sidormat/proc/GetCost(var/obj/item/I)
586615
for(var/datum/data/stalker_equipment/se in real_sidormat_items)
587-
if(itemtype == se.equipment_path)
588-
return se.sale_price
616+
if(I.type == se.equipment_path)
617+
return se.GetCost(I)
589618
return 0
590619

591620
/obj/machinery/stalker/sidormat/ex_act(severity, target)

code/game/stalker/mobs/hostiles/mutants/mutants.dm

+15-6
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,16 @@
1515
spawn(300)
1616
qdel(src)
1717
*/
18-
18+
/*
1919
/mob/living/simple_animal/hostile/mutant/Move(atom/NewLoc, direct)
20-
var/area/B = get_area(NewLoc)
21-
if(B.safezone)
20+
if(get_area(NewLoc).safezone)
2221
if(src.client && (src.client.prefs.chat_toggles & CHAT_LANGUAGE))
2322
src << "<span class='warning'>You can't be here!</span>"
2423
else
2524
src << "<span class='warning'>Âû íå ìîæåòå íàõîäèòüc&#255; â ýòîé çîíå!</span>"
2625
return 0
27-
. = ..()
28-
26+
return ..()
27+
*/
2928
/mob/living/simple_animal/hostile/mutant/AttackingTarget()
3029
..()
3130
if(istype(target, /mob/living))
@@ -503,6 +502,14 @@
503502
if(!.)
504503
return 0
505504
for(var/mob/living/carbon/human/H in view(15, src))
505+
var/monol_ = 0
506+
for(var/faction_ in faction)
507+
if(faction_ in H.faction)
508+
monol_ = 1
509+
510+
if(monol_)
511+
continue
512+
506513
var/damage_ = 0
507514
switch(get_dist(src, H))
508515
if(0 to 2)
@@ -516,6 +523,8 @@
516523
if(8 to INFINITY)
517524
damage_ = 25 / get_dist(src, H)
518525
H.apply_damage(damage_, PSY, null, blocked = getarmor("head", "psy", 0))
526+
if(H.psyloss >= 200)
527+
H.zombiefied = MENTAL_ZOMBIE
519528

520529
/mob/living/simple_animal/hostile/mutant/controller/OpenFire(atom/A)
521530
if(!istype(A, /mob/living/carbon/human))
@@ -555,7 +564,7 @@
555564
visible_message("<span class='danger'><b>[src]</b> stares right into [A] eyes!</span>")
556565
H.apply_damage(200, PSY, null, blocked = getarmor("head", "psy", 0))
557566
if(H.psyloss >= 200)
558-
H.zombiefied = 1
567+
H.zombiefied = MENTAL_ZOMBIE
559568

560569
ranged_cooldown = max(0, ranged_cooldown_cap - attack_stage)
561570
attack_stage = 0

code/game/stalker/mobs/mobspawners.dm

+20-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
name = "mob spawner"
33
cooldown = 1000
44
var/sticky_mob = 0
5+
var/monolith_controled = 0
56

67
/obj/effect/spawner/lootdrop/stalker/mobspawner/SpawnLoot(enable_cooldown = 1)
78
sleep(rand(10, 100))
@@ -23,6 +24,12 @@
2324

2425
var/mob/living/M = new lootspawn(get_turf(src))
2526

27+
if(monolith_controled)
28+
M.faction = list("monolith_forces")
29+
if(istype(M, /mob/living/simple_animal))
30+
var/mob/living/simple_animal/SA = M
31+
SA.loot = list()
32+
2633
if(sticky_mob && istype(M, /mob/living/simple_animal))
2734
var/mob/living/simple_animal/SM = M
2835
SM.return_to_spawnpoint = 1
@@ -84,11 +91,21 @@
8491
cooldown = 15000
8592
loot = list(/mob/living/simple_animal/hostile/mutant/bloodsucker = 100)
8693
sticky_mob = 1
94+
monolith_controled = 1
95+
96+
/obj/effect/spawner/lootdrop/stalker/mobspawner/bloodsucker_spawner/monolith
97+
name = "bloodsucker mutant (monolith)"
98+
lootcount = 1
99+
radius = 1
100+
cooldown = 15000
101+
loot = list(/mob/living/simple_animal/hostile/mutant/bloodsucker = 100)
102+
sticky_mob = 1
87103

88-
/obj/effect/spawner/lootdrop/stalker/mobspawner/controller_spawner
89-
name = "controller mutant"
104+
/obj/effect/spawner/lootdrop/stalker/mobspawner/controller_spawner/monolith
105+
name = "controller mutant (monolith)"
90106
lootcount = 1
91107
radius = 1
92108
cooldown = 15000
93109
loot = list(/mob/living/simple_animal/hostile/mutant/controller = 100)
94-
sticky_mob = 1
110+
sticky_mob = 1
111+
monolith_controled = 1

code/game/stalker/modules/blowout.dm

+8
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ var/global/isblowout = 0
221221

222222
add_lenta_message(null, "0", "Sidorovich", "Loners", "Blowout is over! Leave the shelter.")
223223

224+
for(var/datum/data/record/sk in data_core.stalkers)
225+
if(sk.fields["reputation"] <= VERYBAD)
226+
var/name_ = sk.fields["name"]
227+
var/rep_ = sk.fields["reputation"]
228+
add_lenta_message(null, "0", "Sidorovich", "Loners", "[name_]'s - for at least [GetCostBasedOnReputation(rep_)] RU.")
229+
add_lenta_message(null, "0", "Sidorovich", "Loners", "Find, kill and sell PDAs of these stalker with bad reputation!")
230+
231+
224232
/datum/subsystem/blowout/proc/ProcessBlowout()
225233
if(isblowout)
226234
for(var/mob/living/carbon/human/H)

0 commit comments

Comments
 (0)