Morrowind Mod:Living Cities

The UESPWiki – Your source for The Elder Scrolls since 1995
Jump to: navigation, search

Overview[edit]

Living Cities of Vvardenfell or just Living Cities (abbreviated as LCV) is a mod that concerns itself with varying Morrowind's environment. Feature list:

  • Adds schedules to the NPCs in many of the towns in Vvardenfell (listed below), but does not modify, in any fashion, individual NPCs (thus avoiding incompatibility with other mods). NPCs will go home at night, go to bars, go out at night, go shopping, go walking, and live their little lives on a daily basis. More guards come out at night (works brilliantly with mods such as TLM), and the schedules of NPCs have been done so as to imply who is sleeping with whom, who is the shady business elf, so on and so forth.
  • Adds training sessions at several locations.
  • Adds fishing boats at fishing villages.


Project Status[edit]

Location Author NPCs Extras LGNPC
Ascadian Isles
Ascadian Isles Helios+ ?/? ---- ----
Arvel Plantation Helios+ ?/? ---- ----
Balur's Farmhouse Helios+ ?/? ---- ----
Dren Plantation ? 0/26 ? ----
Gro Bagrat Plantation Helios+ ?/? ---- ----
Llovyn's Farmhouse Helios+ ?/? ---- ----
Omani Manor Helios+ ?/? ---- ----
Ules Manor Helios+ ?/? ---- ----
Ashlander Camps
Ahemussa ? 0/16 ? ----
Erabenimsun ? 0/20 ? ----
Urshilaku ? 0/17 ? ----
Zainab ? 0/10 ? ----
Forts
Buckmoth Helios+ 13/13 ---- ----
Darius ? ? ? ----
Ebonheart Helios+ 74?/74 +Beds ----
Moonmoth Helios+ 10?/10 ---- ----
Strongholds
Ghostgate Helios+ 19/24 ---- ----
Holamayan Helios+ 10/10 ---- ----
Indarys Manor ? 0/15 ---- +
Rethan Manor ? 0/8 ? ----
Tel Fyr ? 0/5 ? ----
Tel Uvirith ? 0/6 ? ----
Towns
Ald'ruhn Helios+ ?/? Train +
Ald Velothi Helios+ 16?/16 ---- +
Balmora Helios+ ?/? Train +Beds +
Caldera ? 0/43 ? ----
Caldera Mines ? ? ? ----
Dagon Fel Helios+ 24?/24 ---- ----
Gnaar Mok ? 0/25 ---- +
Gnisis Helios+ 63?/63 ---- ----
Hla Oad ? 0/18 +Beds +
Khuul Helios+ 13?/13 ---- +
Maar Gan Helios+ 25?/25 Train +
Molag Mar ? 0/48 ? ----
Pelagaid ? 0/23 ---- +
Sadrith Mora Helios+ 102?/102 ---- ----
Seyda Neen Wrye 23/23 Beds X
Suran ? 0/34 ? ----
Tel Aruhn Helios+ 30?/30 ---- ----
Tel Branora Helios+ 34?/34 ---- ----
Tel Mora Helios+ 27?/27 ---- +
Tel Vos ? 0/16 ? ----
Vos ? ? ? ----
Wolverine Hall Helios+ ?/? Train Beds ----
Vivec
Arena ? 0/20 ? ----
Foreign Quarter Helios+ 55?/55 ---- ----
Hlaalu Helios+ 53?/53 ---- ----
Redoran Helios+ 33?/33 ---- ----
St. Delyn ? 0/40 ? ----
St. Olms ? 0/46 ? ----
Telvanni Helios+ 44?/44 ---- ----
Temple ? 0/45 ? ----
Mournhold
Godsreach ? ? ? ----
Great Bazaar ? ? ? ----
Temple ? ? ? ----
Royal Palace ? ? ? ----
Solstheim
Frostmoth ? ? ? ----
Ravens Rock ? ? ? ----
Skaal Village ? ? ? ----
Thirsk ? ? ? ----

Schedule File Format[edit]

LCV schedules scripts are now automatically generated from a specially formatted text file, using a generator built into Wrye Mash. The format for this file is explained below, using an abbreviated chunk of the Seyda Neen schedule as an example...

@ town
SeydaNeen

@ defs
# Cells
sey: "Seyda Neen"
seyGuest: "Seyda Neen, Arrille's Guesthouse"
seyArrille: "Seyda Neen, Arrille's Tradehouse"
seyEldafire: "Seyda Neen, Eldafire's House"
seyFargoth: "Seyda Neen, Fargoth's House"
seyFine: "Seyda Neen, Fine-Mouth's Shack"
seyGilnith: "Seyda Neen, Foryn Gilnith's Shack"
seyGirvayne: "Seyda Neen, Terurise Girvayne's House"
seyLighthouse: "Seyda Neen, Lighthouse"
seyLlenim: "Seyda Neen, Erene Llenim's Shack"
seyRathryon: "Seyda Neen, Indrele Rathryon's Shack"
seyThiralas: "Seyda Neen, Draren Thiralas' House"
seyOffice: "Seyda Neen, Census and Excise Office"
seyVodunius: "Seyda Neen, Vodunius Nuccius' House"
seyWarehouse: "Seyda Neen, Census and Excise Warehouse"
# Other
seyLHWatch: "Seyda Neen" -12218 -74310 1107 257 wander 0

@ sleep
+ .seyGuest
+ .seyEldafire
+ .seyFargoth
+ .seyFine
+ .seyGilnith
+ .seyGirvayne
+ .seyLlenim
+ .seyOffice
+ .seyRathryon
+ .seyThiralas
+ .seyVodunius
+ .seyWarehouse
- .sey

@ code
1,2
SC_SeydaNeen_boat1->enable
SC_SeydaNeen_boat2->enable
3,4
SC_SeydaNeen_boat1->disable
SC_SeydaNeen_boat2->disable

@ adraria vandacia
1 .seyWarehouse 458 -274 590 64 wander 600 .i62 # tower
2 .seyWarehouse -32 1024 288 225 .stand 0 40 20 20 10 # desk
3 = 2 # arr
4 .seyWarehouse -851 -462 13 55 .stand .s01 # bed

@ albecius colollius
1 .seyArrille -195 -52 405 185 .stand .i62 # front
2 = 1 # front
3 .seyArrille -195 -52 405 185 .stand .i62 # back
4 .seyGuest 13 -4 7 326 .stand .s01 # guest

@ arrille
1 .seyArrille -257 -261 135 0 .stand .i62 # downstairs
2 .seyArrille -457 24 397 102 .stand .i62 # upstairs
3 = 1
4 .seyArrille -257 -261 135 0 .stand .s02

@ darvame hleran
1 .sey -8604 -70205 831 11 wander 200 .i62 # strider
2 = 1
3 .sey -8604 -70205 831 11 .stand .i62 # strider w Teruise
4 .seyGirvayne 115 55 -116 234 .stand .s02

@ draren thiralas
1 .seyWarehouse 335 -189 18 185 wander 800 .i31 # tower
2 .seyLHWatch .i62 # lhtop
3 .seyThiralas -28 99 -117 179 .stand .i62 # home
4 .seyThiralas -28 99 -117 179 .stand .s02 # home

@ eldafire
1 .sey -11422 -68238 308 174 wander 2000 .i62 # square
2 .seyWarehouse 335 -189 18 185 wander 800 .i65a # tower
3 .seyLHWatch .i62 # lhtop
4 .seyEldafire -251 7 -122 211 wander 100 .s01 # home

@ elone 
1 .seyArrille -457 24 397 102 .stand .i62
2 .seyArrille -257 -261 135 0 .stand .i64 
3 = 1
4 .seyEldafire 119 131 -110 208 .stand .s02

@ fargoth: fargothwalk == 3 # Completed lookout quest.
1 .seyLighthouse 168 -30 -792 268 wander 400 .i31 
2 .sey -10511 -71218 196 113 wander 512 .i40a # square
3 .seyWarehouse 335 -189 18 275 wander 800 .i65a # tower
4 .seyFargoth 70 125 -104 176 .stand .s02 # home

comments Any text starting with '#' is a comment and is ignored. This is useful for adding notes about what the character is doing in case it isn't evident in the schedule itself.

town defines the base name for the scripts and constants.

defs marks the beginning a section of text aliases. E.g., the def for "seyWarehouse" will expand to "Seyda Neen, Census Office Warehouse" whenever ".seyWarehouse" is later used in the file.

sleep This builds the sleep script... Basically SC_Sleep is set to 1 in cells marked with a '+' and is set to 0 (off) in cells marked with a '-'. Note that a cell like Arrille's tradehouse will fall through and get caught by the last "Seyda Neen" -- hence you usually only need to put the town cell as last and define it as minus. Note that you can and should use text aliases here.

code These are chunks of code that getted added to the corresponding cycle scripts. Here the code to enable the fishing boats is added to cycles 1 and 2, while code to disable them is added to cycles 3 and 4. Code to be shared by all cycle scripts can be put immediately after the "code" line (e.g., before 1,2 in the example above).

NPC Schedules: So the final work is mostly defining the positionCell coordinates for the four times of day (1 = morning to 4 = after midnight). A repeated schedule is marked by a '= N' where N is the earlier cycle that is being repeated.

An NPC's schedule can be made dependent on a condition -- e.g., Fargoth doesn't start doing his schedule until he's done his walkabout thing. Furthermore an npc can have several schedules, where different schedules are dependent on different conditions. E.g., Indrele's schedule could be dependent on her LGNPC Seyda Neen quest.

For each schedule cycle, you define the cell to position them in, then their x, y, z and rotation coordinates. To get these coordinates, position the NPC in TESCS and then read their coordinates from the status bar. (In about the middle of the bar, you'll see something like: 258, -1528, -409 (0, 0, 329) -- the first three numbers are the x, y and z coordinates and the last number in parentheses is the rotation.) Usually, for cycle one, you'll use the original coordinates of the player -- though you don't have to. To get coordinates for other times of day, place a dummy NPC at the cell/position/rotation that you want and then read off their coordinates. (BTW, after placing a bunch of dummy NPCs, you want to make sure to NOT save the esp -- you're only using them to get information.) Also, you'll probably position your text editor window so that you can still see the TESCS status bar while typing the coordinates in the text editor window.

After you give the cell and coordinates, you need to give the AI action. Usually, this is wander, but it can also be travel or follow. The formats are: - wander distance idleNumbers - travel travel-to-coordinates - follow who [etc. same as regular script command] Note that for wander you should NOT enter the start time or duration -- these are automatically added by the code generator. Note also that there's no "AI" in front of wander, travel or follow. To get the NPC's original AI action, double click on them and then click on their AI button. (If the NPC is blocked, just uncheck "blocked", save, and then reopen them.) From the AI, you'll see the wander distance (ignore the duration and time of day numbers), then look at their idle numbers and mentally add a "0" at the beginning for "Idle 1" -- then match that number to one of the idles below. E.g. "40 20 20 10" matches to i42. (This may seem like a hassle, but there's only about 6 idles that are used really frequently, so you'll quickly learn them.)

For idlenumbers you usually use one of the built in idle text aliases, e.g. .i62 (0 60 20 10 10) or .s02 (0 15 15 20 10 40 0 25). Usually, you'll get the NPC's idle from their AI. Look at the NPC's object info and click on the AI

The "s" idles are good for sleepy characters. Just make sure that NPCs that end up standing next to each other don't have exactly the same idles. I usually give women .s01 and men .s02.

It's pretty common for NPCs to stand in one place, and for them you can use ".stand" in place of "wander 0".

Remember you can also define arbitrary text aliases if it's convenient. For example, in Seyda Neen, everyone who stands lighthouse watch has the same position and AI action, so I define "seyLHWatch" to ""Seyda Neen" -12218 -74310 1107 257 wander 0"

Default text aliases are (from mush.py):

#--Misc
stand: wander 0

#--Idles
#    stand still
#     0 shift legs
#     0  0 look behind
#     0  0  0 scratch head
#     0  0  0  0 shift clothes; hf: hands on hip
#     0  0  0  0  0 yawn
#     0  0  0  0  0  0 fingers, look around
#     0  0  0  0  0  0  0 hands to chest
#     0  0  0  0  0  0  0  0 weapon, touch head; kf: scratch head
#     0  0  0  0  0  0  0  0  0
s01:  0  5 20 40 15 60  0 10
s02:  0 15 15 20 10 40  0 25

i00:  0  5  5  5 10 10
i10:  0 10 60 20 10 10 
i30:  0 30 10 10 
i31:  0 30 20 30 30  0 15 15 # fidget/heartburn
i40:  0 40 20 10 10
i40a: 0 40 20 10 10  0 20 # fidget
i41:  0 40 20 10 10 10
i42:  0 40 20 20 10
i43:  0 40 20 20 10 10
i43a: 0 40 20 10 10  0 40 # heartburn
i44:  0 40 30 30 10
i45:  0 40 40 40 10
i46:  0 40 40 40 10 10  0 10
i50:  0 50 20 20 10
i51:  0 50 20 20 20 10
i52:  0 50 30 30 20 10
i53:  0 50 50 10 10

i60:  0 60 20 10
i61:  0 60 20 10  0 10
i62:  0 60 20 10 10
i63:  0 60 20 10 10  0  0 10 
i63a: 0 60 20 10 10  0  0 10 10 #heart/weaps
i63b: 0 60 20 10 10  0  0  0 10 #weap
i64:  0 60 20 10 10 10 
i65:  0 60 20 20 10
i65a: 0 60 20 20 20
i66:  0 60 20 20 10 10
i67:  0 60 20 20 10 10 10
i68:  0 60 20 20 20 10
i69:  0 60 20 20 20 10 10 10

i70:  0 60 30 10 10
i71:  0 60 30 30 10
i72:  0 60 30 30 10 10
i74:  0 60 30 30 10 10 10

i80:  0 60 40 30 20 10 10
i81:  0 60 40 40 10 10
i82:  0 60 40 40 20 10 10

i90:  0 60 60 10 10
i91:  0 60 60 100 10

External Links[edit]