OverviewEdit
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 StatusEdit
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 FormatEdit
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