Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Where is it said there are tas tools?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
It kept desyncing until I set Time="32.000000" in the ini.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Amazing music (catchy and dark, unusual for old games, Bram Stoker's Dracula is another exception), authentic visual style, fluid gameplay, and cool execution. Voted yes!
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
We don't know yet. eien86 is using a different version of ubuntu, that's all we currently know. As long as someone on staff got it to sync and has a video dump, it's fine.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
The time difference is just 1.5 minutes, and the viewers can skip ahead in the video. We use extended input for post-completion manipulations that show final content that won't automatically appear, so simply speeding up the credits (but only partially) doesn't look worth a secondary movie file.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
The movie doesn't sync if I recreate the save and ini files the way you described. It gets stuck on a black screen around frame 16k.
Also debug mode seems to need to be turned off after save files are created.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
The font needed a bit of tweaking, update Post #527775.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
What bizhawk version are you using?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
-- feos, 2015
-- + modification by r57shell in 2015
local rw = memory.read_u16_be
local rl = memory.read_u32_be
lastcfg = 0
dcfg = 0
rngcount = 0
rngcolor = "white"
rngobject = 0
rngroutine = 0
MsgTime = 16
MsgStep = 256/MsgTime
MsgTable = {}
bombs = {}
goback = {}
goforth = {}
--25BBA0
cmdstr = {
[0x00+1] = "wait",
[0x01+1] = "jmp",
[0x02+1] = "call",
[0x03+1] = "ret",
[0x04+1] = "round jmp",
[0x05+1] = "def",
[0x06+1] = "idk",
[0x07+1] = "table",
[0x08+1] = "rndcall",
[0x09+1] = "clr",
[0x0A+1] = "text",
[0x0B+1] = "stop",
[0x0C+1] = "diff jmp",
[0x0D+1] = "smt",
[0x0E+1] = "incs",
[0x0F+1] = "save",
[0x2b+1] = "dec",
[0x2d+1] = "inc",
[0x30+1] = "p0",
[0x31+1] = "p1",
[0x32+1] = "p2",
[0x33+1] = "p3",
[0x34+1] = "p4",
[0x35+1] = "p5",
[0x36+1] = "p6",
[0x37+1] = "p7",
[0x38+1] = "p8",
[0x39+1] = "p9",
[0x3A+1] = "p10",
[0x62+1] = "bomb",
[0x63+1] = "down",
[0x64+1] = "up",
[0x65+1] = "upp",
[0x68+1] = "bonus",
[0x70+1] = "puppy",
[0x72+1] = "skip",
[0x7a+1] = "end",
}
function cmdlen(ptr)
local cmd = memory.readbyte(ptr)
if cmd == 0xA then
return 3
elseif cmd == 0x1 then
return 5
elseif cmd == 0x2 then
return 5
elseif cmd == 0x7 then
return 5
elseif cmd == 0x4 then
return 6
elseif cmd == 0xC then
return 6
elseif cmd == 0x6
or cmd == 0x5
or cmd == 0xD
or cmd == 0x72 then
return 2
end
return 1
end
function cmdname(ptr)
local cmd = memory.readbyte(ptr)
local an = cmdstr[cmd+1] or "unk"
if cmd == 0xA then
local t = memory.readbyte(ptr+2)
if t >= 26 and t <= 30 then
an = an .. " " .. "Round " .. (t-25)
elseif t == 25 then
an = an .. " " .. "Use the Bomb"
else
an = an .. " " .. t
end
elseif cmd == 0x6
or cmd == 0xD
or cmd == 0x72
or cmd == 0x5 then
an = an .. " " .. memory.readbyte(ptr+1)
elseif cmd == 0x1
or cmd == 0x2
or cmd == 0x7 then
an = an .. " " .. string.format("%X",rl(ptr+1))
elseif cmd == 0xC
or cmd == 0x4 then
an = an .. " " .. memory.readbyte(ptr+1) .. string.format(" %X",rl(ptr+2))
end
return an
end
function iswait(ptr)
local cmd = memory.readbyte(ptr)
return cmd == 0xA
or cmd == 0xB
or cmd == 0x63
or cmd == 0x64
or cmd == 0x65
or cmd == 0x3C
or cmd == 0
end
function writetofile(file, cfg)
local rnd = {}
local rndname = nil
for i=0,1000000 do
local cmd = memory.readbyte(cfg)
local an = cmdname(cfg)
local cl = cmdlen(cfg)
local hex = ""
for z = 1, cl do
hex = hex..string.format("%02X",memory.readbyte(cfg+z-1))
end
if cmd == 0x2b or cmd == 0x2d or cmd == 0x0 then
for z = 1, 10000 do
if memory.readbyte(cfg+z) ~= cmd then
cl = z
break
end
end
an = an .. ' x' .. cl
end
if cmd == 0x7 then
table.insert(rnd, {rl(cfg+1), rndname});
rndname = nil
end
if iswait(cfg) then
an = "-" .. an
else
an = " " .. an
end
file:write(string.format("%X %-12s %s\n",cfg,hex,an));
cfg = cfg + cl
if cmd == 0xF then
if memory.readbyte(cfg) == 0xA
and memory.readbyte(cfg+2) >= 26
and memory.readbyte(cfg+2) <= 30 then
file:write("======== Round " .. (memory.readbyte(cfg+2) - 25) .. " ========\n")
rndname = "Round_" .. (memory.readbyte(cfg+2)-25);
else
file:write("================\n")
end
end
if i>0
and cmd==0xB
or cmd==0x3
then break end
end
return rnd
end
function writecfg(fname, ptr)
local file = io.open(fname,"w+")
file:write("======== main cfg ========\n\n")
local rnd = writetofile(file, ptr)
for i = 1,#rnd do
local r = rnd[i];
local count = rw(r[1]);
for j = 1, count do
if rnd[2] then
file:write(string.format("\n======== table %s %d ========\n\n", r[2], j))
else
file:write(string.format("\n======== table %X %d ========n\n", r[1], j))
end
writetofile(file, rl(r[1]+2+4*(j-1)))
end
end
file:close()
end
-- uncomment this if you want dumps
--writecfg("puppy1.txt",0x275FDC)
--writecfg("puppy2.txt",0x27658E)
--writecfg("puppy3.txt",0x276ECC)
function DrawConfig(cfg, xpos)
local h = 7
for i=0,25 do
local action = memory.readbyte(cfg)
if action==0x62 or action==8 or action==3 or action == 0xB then color = "red"
elseif action>=0x63 and action<=0x65 then color = "orange"
elseif action>=0x30 and action<=0x32 then color = "green"
elseif action>=0x66 and action<=0x70 then color = "#00a000ff"
elseif action==0x7a then color = "white"
else color = "#aaaaaaff"
end
local an = cmdname(cfg)
if iswait(cfg) then
an = "-" .. an
else
an = " " .. an
end
local cl = cmdlen(cfg)
local hex = ""
for z = 1, cl do
hex = hex..string.format("%02X",memory.readbyte(cfg+z-1))
end
if action == 0x2b or action == 0x2d or action == 0x0 then
for z = 1, 10000 do
if memory.readbyte(cfg+z) ~= action then
cl = z
break
end
end
an = an .. ' x' .. cl
end
gui.pixelText(xpos,i*h+32,string.format("%X %s",cfg,an),
color)
cfg = cfg + cl
if i>0
and action==0xB
or action==0x3
then break end
end
end
function randomsleft(cfg)
local left = 0
for i = 1, 1000 do
local cmd = memory.readbyte(cfg)
local cl = cmdlen(cfg)
if cmd == 8 then
left = left + 1
end
cfg = cfg + cl
if cmd==0xB
or cmd==0x3
or cmd==0xF
then break end
end
return left
end
function Configs()
if rl(0xfffc2a)==0 then return end
local rng = rl(0xffa1d4)
local cfg0 = rl(0xfffc2a)
local cfg1 = rl(0xfffc9a)
gui.pixelText(100,0,string.format("rng: %08X : %d",rng,rngcount),rngcolor)
gui.pixelText(220,0,string.format("Timeout : %3d of %3d",memory.readbyte(0xFFFC7D),memory.readbyte(0xFFFC7C)))
gui.pixelText(220,8,string.format("Something: %3d of %3d",memory.readbyte(0xFFFAA6),memory.readbyte(0xFFFAA7)))
if memory.readbyte(0xFFFF2A) == 0 then
gui.pixelText(270,16,"Bonus: yes")
else
gui.pixelText(270,16,"Bonus: no")
end
if lastcfg~=cfg0 then dcfg = cfg0-lastcfg end
lastcfg = cfg0
local cfg = rl(0xfffc2a)
local left = 0
if (cfg >= 0x275FDC and cfg <= 0x27614C)
or (cfg >= 0x27658E and cfg <= 0x276797)
or (cfg >= 0x276ECC and cfg <= 0x2770D6) then
DrawConfig(cfg, 104)
left = randomsleft(cfg)
else
DrawConfig(cfg1, 104)
DrawConfig(cfg, 204)
left = randomsleft(cfg1)
end
gui.pixelText(100,16,"Randoms left: " .. left)
end
function Seek()
bytes = 0
waves = 0
steps = 0
local ret = ""
for bytes=0,10000 do
local cfg = rl(0xfffc2a)+bytes
local action = memory.readbyte(cfg)
local newaction = memory.readbyte(cfg+1)
if action==0x7a then
waves=waves+1
steps=steps+1
end
if action==0x63 or action==0x64 or (action==0 and newaction==0) then
steps=steps+1
end
if action>=0x30 and action<=0x32 then
if newaction==0x70 then
steps=steps+1
elseif newaction==0x62 then
ret = string.format("BOMB in %d waves %d steps",waves,steps,bytes)
break
end
elseif action==3 then
ret = string.format("Forth in %d waves %d steps",waves,steps,bytes)
break
elseif action==0xe and newaction==8 then
ret = string.format("Back in %d waves %d steps",waves,steps,bytes)
break
end
end
gui.pixelText(100,8,ret)
end
function Objects()
local base0 = 0xffa2ea
for i=0,0x23 do
local base = base0+i*0x6e
local id = memory.readbyte(base)
if id>0 and id~=0x82 then
local x = Clamp(rw(base+2)-4096-camx,0,310)
local y = Clamp(rw(base+4)-4096-camy,0,214)
local vel = rw(base+0x18)
local a = rl(base+0x14)
local color = "white"
PostRngRoll(base,x,y)
local hp = memory.readbyte(base+1)
if hp ~= 0 then
gui.pixelText(x,y,string.format("%X\n%d",base,hp),color)
else
gui.pixelText(x,y,string.format("%X",base),color)
end
end
end
end
function Bounce()
if memory.readbyte(0xffa515)==0x60
then offset = 8
else offset = 0 end
local counter = memory.readbyte(0xfffc87)
local a0 = 0xfffc88
local d0 = (memory.readbyte(a0+counter) << 5)+offset
local a3 = 0x25d482
local vel = rw(a3+d0)
local bounce = 0
if vel == 0x200 then bounce = 3
elseif vel == 0x3e0 then bounce = 1
else bounce = 2
end
gui.pixelText(0,0,string.format("next bounce: %d",bounce))
end
function PostRngRoll(object,x,y)
for i = 1, #MsgTable do
if (MsgTable[i]) then
if object==MsgTable[i].object_ then
local color = 0xff000000+(MsgTable[i].timer_-emu.framecount())*MsgStep
gui.line(120,8*i+8,x,y,color)
gui.pixelText(100,8*i+8,string.format("%X",MsgTable[i].routine_),color)
end
if (MsgTable[i].timer_<emu.framecount()) then
MsgTable[i] = nil
end
end
end
end
function Clamp(v1,v2,v3)
if v1<v2 then v1=v2
elseif v1>v3 then v1=v3
end
return v1
end
while true do
camx = rw(0xffa172)
camy = rw(0xffa174)
frame = emu.framecount()
Objects()
Bounce()
Configs()
Seek()
lastframe = frame
emu.frameadvance()
end
function Dump()
for p=0x275fea,0x277b79 do
local a = memory.readbyte(p)
if a==0x62 then
table.insert(bombs,string.format("%X",p))
elseif a==8 then
table.insert(goback,string.format("%X",p))
elseif a==3 then
table.insert(goforth,string.format("%X",p))
end
end
print("bombs:")
print(bombs)
print("")
print("goback:")
print(goback)
print("")
print("goforth:")
print(goforth)
print("")
end
--Dump()
emu.registerbefore(function()
rngcount = 0
rngcolor = "white"
rngobject = 0
end)
memory.registerwrite(0xFFA1D4,function()
rngcount = rngcount+1
rngcolor = "red"
rngobject = memory.getregister("a1")
rngroutine = memory.getregister("a0")
for i = 1, 50 do
if MsgTable[i] == nil then
MsgTable[i] = {
timer_ = MsgTime + emu.framecount(),
object_ = rngobject,
routine_ = rngroutine
}
break
end
end
end)
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
It can be converted to a hawk script if that will help you.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
It says "Please, report found issues to our chat", it's still beta so it didn't warrant a proper release.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Looks awesome! Which version of the script are you using?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
What would it change?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Welcome our newest judge, eien86!
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
https://nnp.nnchan.ru/ml/MahoLator is a J2ME emulator for PC. It's based on MahoTrans - interpreter JVM written on C# completely from scratch.
Custom JVM implementation allows cool things. MahoLator aims to provide:
No dependency on "conventional" java tools in your system
Built-in debugger and application state explorer
Taking/loading snapshots of application states
Input record, playback and edit
"Strict" mode with 100% accuracy and reproducibility
Project is in beta state. Performance and compatibility is work in progress. Expect things to break. Please, report found issues to our chat.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
They were modified by me making the file0 save in the game initially. Can I remove them or do they have to contain something specific?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
What about file9 and undertale.ini?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Yeah we don't reject for being slower than an existing record if the record is on a version of the game that has different tricks.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Is there a complete updated TAS record for that original version of the game?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
Thanks. Can you roughly estimate time that could be saved if this run was done today on the same game version it used originally, but using all the new tricks available for that version?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
How large is it?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
If you only find one quark and lose all the shots, it won't tell you you solved it but will show the quarks you missed and ask if you want to play again. Doesn't look like an ending, let alone a quicker one.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
What would be different when aiming for fastest completion?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
TaoTao, do you have a preference on which file should be used for publication - with or without sound? If they are so similar than it's impossible to notice the difference in gameplay (real-time duration is the same too), it sounds like the one with audio would be more beneficial. We can technically publish both movies in the same publication, but I don't know if the silent version is so helpful to have primarily featured like that.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player
(1236)
Joined: 4/17/2010
Posts: 11270
Location: RU
While I see the value in allowing 3rd party tools to convert games into a different format to avoid loading, there's indeed a question of how legitimate and authentic the result is, and how do we restrict it to something that makes sense to the community as a whole. Interestingly, if a big part of the community prefers the current strict standard of no unofficial converters, that's a valid stance to take and we can't ignore it. And personally I can't come up with arguments that would be able to push the consensus towards allowing unofficial converters under some clever conditions that make sense to everybody involved...
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.