Gameplay content
Creations and channels
Give the things people make an identity, and let a mod run a channel whose posts point at them, with disclosed sponsorships and reactions from people the player knows.
Creations
A finished song, a painting, a tasting menu is a creation: an id in your mod, who made it, its discipline, its quality, when it was finished.
lualocal M = "ul_Hobbies"
local why = Creations:create(M, "work_3", {
title = "An original song", discipline = "Music",
quality = Game:GetPlayer():GetStat("music"), -- 0-100
tangible = false, -- a performance
})
-- Showing it at a venue: once per piece and venue, so a scene run twice never pays twice.
local here = Places:here()
if Creations:refer(M, "work_3", "showcase:" .. here.id) then
-- the reception, the reward, the history line
end
- Who made it, who has it.
creatordefaults to the player; anyone can make something (creator = person). A tangible work (tangible, the default) is held by someone and kept somewhere:Creations:give(mod, id, person)hands it to a contact,Creations:keep(mod, id, "home" | "carried" | "here" | buildingId)puts it somewhere. A performance is shown and remembered, not handed over. - References. A showing, a post, an exhibition, a history line:
referadds a reference string once and answersfalsethe second time. Use it as the guard on any reward. - Visible. Works someone made or holds are listed under WORKS on their person sheet: title, discipline, "by you", where it is kept, how many times it was shared.
Creations:discardkeeps the record (history may still name it) but it can no longer be shown or given.creationChanged(mod, id, what) fires on each change.
Not done by the engine: a work hung on a wall of a room, or an audience in the room. A showcase stays a narrative scene.
Channels
A channel is your mod's feed: posts with stable ids, which can point at creations, people and activities.
lualocal M = "ul_SocialMedia"
Channels:open(M, "feed", { name = "Open Feed", reactions = true, sponsorCap = 100 })
local r = Channels:post(M, "feed", {
text = "The middle of the process.", kind = "honest",
creations = { "ul_Hobbies/work_3" }, people = { ana },
})
if r.ok then Creations:refer("ul_Hobbies", "work_3", "post:" .. M .. "/feed/" .. r.id) end
-- Sponsored: always disclosed, paid through the wallet once, capped per week.
local s = Channels:post(M, "feed", { text = "A local recommendation.", sponsor = "Corner shop", pay = 80 })
-- s.paid can be less than asked: the weekly cap.
Channels:pause(M, "feed", 24) -- a break: posts are refused until it ends
- Your numbers stay yours. Followers, trust, pressure: keep them in your mod. Nothing here is fame or pornfame, and nothing reads them.
- Sponsored posts are disclosed. A post with a
sponsorreturns adisclosureline ("Sponsored · Corner shop") with every read: show it with the post. The payout goes to the player's cash through the wallet, keyed by the post, so it is never paid twice, and never more thansponsorCapper rolling week for that channel. - Breaks are real. During
pause,postanswers why not. - Reactions (
reactions = true): two game hours after a post, up to five contacts react: the people the post names first, then contacts with rapport 30 or more with the player, best first. Blocked people, strangers and minors never do. They are saved on the post (p.reactions, with names), reported once each throughpostReacted, and announced in one notification per post, grouped by channel, under your mod's notification setting (notify = falseturns them off for the channel). A disabled mod's reactions wait until it is enabled again. - The last 50 posts of each channel are kept.
Migrating an older feed
Post the old entries with migrated = true (and at = 0 if you do not know when): they never pay, nobody reacts, and posting breaks do not refuse them. Leave your cooldown variables alone.
| Call | Does |
|---|---|
Creations:create(mod, id, { title, discipline, quality, creator, tangible, at, data }) |
nil, or why not. |
Creations:get(mod, id) |
{ module, id, title, discipline, quality, tangible, creator, creatorName, holder, holderName, place, placeName, refs, data, created, discarded } |
Creations:list([mod [, person [, discipline]]]) |
Made or held by person. |
Creations:give(mod, id, person) / keep(mod, id, place) |
nil, or why not. |
Creations:refer(mod, id, ref) |
true the first time. |
Creations:discard(mod, id) |
true if it was not already. |
Channels:open(mod, key, { name, reactions, notify, sponsorCap }) |
Creates or updates. |
Channels:post(mod, key, { text, kind, id, creations, people, activity, sponsor, pay, migrated, at }) |
{ ok, id, paid } or { ok = false, reason } |
Channels:pause(mod, key, hours) |
0 ends the break. |
Channels:get(mod, key) |
Settings, sponsoredThisWeek, pausedUntil, post count. |
Channels:posts(mod, key [, count]) / findPost(mod, key, id) |
Newest first. |