forked from worldforge/cyphesis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TODO
1652 lines (1175 loc) · 67.1 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Write an EntityKit TypeNode integration test. The addAttributes path needs
to be tested.
Check in EntityRuleHandlertest that things behave correctly if
EntityBuilder::installFactory fails. Same in PropertyRuleHandlertest for
CorePropertyManager::installFactory.
Location and MemEntity both have a timestamp, which do very close, but not
quite the same thing. See if we can come up with a design to eliminate the
difference?
MemEntity is an ideal case for a memory pool, especially if you include
the PythonWrapper object.
There may be a compute saving to putting mem entities into their containers
directly in addContents(), rather than having to do the lookup when we
get the SIght data in readEntity
MemMap::findByType would be more efficient if we find the TypeNode probably.
Make LocatedEntity the sole base class for dealing with entities.
* Move remaining Property methods into LocatedEntity, de-virt modProperty
and setProperty
* Convert MemMap to store using LocatedEntity maybe?
* LocatedEntity::setAttr ignores the class of type properties. It should
call copy as in Entity::
traits on property to specify the name simply.
Providing there is no extra deps, move all the property access methods
into LocatedEntiy.
1) MemEntity will need type properties to save RAM, so let it have them
(Property<foo> rather than SoftProperty. This is the difference between
using ClientPropertyManager and CorePropertyManager)
See if we can create a Property<Map> class with extra interface, rather
like the generic methods added to TerrainModProperty
We don't need PropertyManager to be virtual. Just move all the functionality
into the base class.
Remove libcommon from WorldRouterintegration and
Rulesetintegration
Remove BaseWorld lookup from TeleportAuthenticator, and use isDestroyed
instead. Requires holding a reference.
disconnectObject does not remove a non-Account ConnectableRouter from
the connection. Neither does it remove Characters.
Add checks to ensure unlinkExternalMind has the desired effect on movement.
Once these checks are in place, we can do the movement change more directly
without having to go via the mindMoveOperation phase.
Make [un]linkExternalMind return success, to indicate if an event should be
logged. Keeps logging of events cleanly in the server code.
The dynamic_cast, and other logic can be removed from Connection::operation
if it could be moved into Character::externalOperation. In order for this
to be possible, Link and ExternalMind move into common, and CommSocket
would need to move into a library. This removes an expensive dynamic_cast
from the path of every operation coming into the server.
Appropriate clothing buff.
- match the weather in terms of warmth
- social bonus for not wearing battle gear
Ducplicated code in ServerAccount::addNewEntity; very similar to
Account::addNewCharacter.
Reverse the flow of the possess key on the server. Have it created on the
destination based on a secret, and passed back to the source server, and from
there back to the client.
A solid attempt at i18n, which different l12n for connections?
1. Make sure all retries have exponential backoff.
2. Make sure all periodic things have jitter.
a) Metaserver query needs deterministics jitter, to ensure clients drift.
b) AI needs smaller jitter for now
c) Trees need bigger jitter, but again deterministic - same offset each
time for a given instance.
Abstract rules. Tasks are already one type, but we need MOAR! recipes,
and designs and stuff.
Move Server (base of ServerRouting) reference into Link.
It needs to actually handle lobby dispatch first.
There are only very few places where ConnectedRouter::m_connection is used
as anything other than Link - should be possible to weaken the coupling.
When coverage tells us 0% in a header, that is because the header had to
generate implicit default code - probably destructor.
Move logic for reply ops from CommClient::objectArrived to Connection?
Would probably clean up the logic in CommClient, and allow send()
to be removed.
Name of server for negotiation purposes is done _every_ connection
in CommClient. Calculate it centrally.
Client connection can be made way more efficient by embedding the objects
as members, rather than using pointers. To this end, make Negotiate
a member, using a template arg. Make the stream type also a member.
Move all explicit listener related functionality to a subclass
of CommClient, leaving CommClient as the common, template base class
for CommPeer and the new class. Encoder could also be embedded, except for
the need to pass in the codec on construction - arguably bad design.
Now that the client is getting an info response to create, get rid of the
need to see?
On account connection, the call to MTRand to salt and encrypt the password
looks a bit expensive. Syscalls opening dev/urandom, which could block.
Intetionally surrender as many capabilities as we can in order to avoid
security issues.
Peer should probably store a lower level version of the hostname, rather
than the input to the resolver, thus ensuring the other party can connect
to the right place. Juncture stores the high level representation, and uses
DNS to resolve. This is correct, as it may need to re-resolve
later - the other server may have moved. Peer will get deleted if the other
servers address changes, and has to express an accurate version to the client.
In Juncture - tighten up detecting the failed socket condition.
Once we are connected to Peer, probably shouldnt have the m_socket pointer
any more, and need to make sure we are no longer connected to the signals.
Can we clear the socket signals?
There are many ways in which MemMap does the same job as WorldRouter.
Common base class?
Fix up WorldLoader so it can work with IG only. Requires support for
GetOperation in Creator
Optionally report back success in the form of Info on in-game ops with
serialno?
Improve Interactive to use serialno for responses
Why isn't ExternalMind a ConnectedRouter
Re-factor login code so Session is the unique class rather than Account.
Constraining logins to be one per account may be sound policy, but it
should be policy rather than a hard constraint of the architecture.
Need to work out what to do with sections, vs rulesets when uploading and
storing rules at the server end.
Probably cleaner, and less globals to initiate ruleset load from the config
phase in main()
It's possible to add permissions and possibly even protection against
CPU overload into the scripting API. Permissions could be controlled by a
global context as well is flags on the objects
Consider moving WorldTime back to Python, or making it way more data driven
Create inherited types in the script API for common operations - actually
cheaper believe it or not
A given owning entity (Account/Admin) needs to keep track of the work it is
doing when doing a ruleset upload. The whole ruleset change should be
encapsulated into a transaction, with its own instance of RuleHandler etc,
and once done it should be possible to check for errors, commit, or not.
Writing rules to database should only be done if transaction succeeds, so
all pending writes need to be encapsulated too. This requires the handler
and builder code not to be in server.
Add a Server config class in server/ which adds all the base EntityFactories
to the builder, and the PropertyFactories to the CorePropertyManager. Then
both those can be made independant of server. It could also handle all the
really core types being added to Inheritance.
Is PyCreator/PyCharacter still needed in the client side? It seems to have
been abandoned before being fully introduced.
Add Arithmetic functionality to all scripts. Cos you know.
Add the concept of the Property script in general and use it to replace the
un-flexible concept of a specific Arithmetic script type.
It may be just more efficient to ignore this concept for most scripts,
but will almost certainly simplify the code to add it to many.
A more flexible concept of scripting attributes might make sense too.
Move to a mechanism like the new mind property for statistics
Include doxygen docs in http self-served docs.
Make it possible to forget
Use "name" as the property that is supposed to get an operation
EntityBuilder shouldn't need a permenent reference to the world.
Allow long cut and cross cut with saws. Long cut is along grain, bisecting by longest dimension. cross cut is across both grains
Sort out a better way to handle materials. We shouldn't have a base class
the same as an attribute without the entity hierarchy, but being able to
declare attributes, and have definition data would be necessary. Good sample
case for having proper data driven, scriptable properties.
use boost intrusive containers for op queues
Check out _GLIBCXX_DEBUG
Turns out to be useful to detect usage issues with STL, but requires full
rebuild of everything that uses stdc++, including non WF deps.
Macro todo list
Re-work Atlas to be more secure, client driven encrypted
Make server more modular, scalable
Protocol revision:
Stop announcing by server, request at client instead
Consolidate negotiation, and allow other undefined headers
Allow for multiple exchanges during negotiation
Use SCMS like scheme to ensure no grey goo. entities cannot create other
entities which can create further persistent entities.
Frontends, backends, routers based architecture
Use 64bit milliseconds everywhere. Merge SECONDS and STAMP into a single
attribute. Get rid of FUTURE_SECONDS in favor of things being able to set
STAMP/SECONDS in advance. Use time for STAMP instead of incrementing integer.
Character should inherit from and implement the Agent interface, which
the server code uses when talking to it. This de-couples server from most
of the rulesets directory.
If we want to support loading data and config over network, make the loader
classes abstract so the underlying implementation for getting data can vary.
Add config option which allows server owner to control the type of account
created by default. If they want "admin"/"builder" then they should have it.
In fact "builder" is a smashing idea for a new account type.
Harmonize Atlas repr of Areas with mods, and also fix bindings and properties
to make exchanging data easier.
Add new kind of marker area, only used internally to track things about
bits of terrain, like ownership. Requires new class in Mercator probably.
We should say "circle" to reference WFMath::Ball in 2D. Pick a different name
depending in dinension. "rectangle" instead of "box" perhaps.
Allow Admin to use an op - perhaps Login - to claim any object on the server.
Use Java object builder/aspect pattern for Property factories in
CorePropertyManager
It looks as though Look FROM account is required to activate a possess key,
which I was not expecting. Are clients expecting this?
Add database stuff to store server metadata like version of server,
(to detect rolling back to earlier versions).
TerrainModProperty:
Do the same for areas.
We need op post-processing rather than pre-processing for move updates.
Abstract entities for tracking non-physical concepts such as quests, trade
transactions, entity recipes, contruction blueprints etc.
See http://www.igda.org/newsletter/?p=483 for how to do trading.
Extend Mercator to allow terrain mod volume calculations. Use these to work
out when a quarry should work, and how much it should be extended.
Sort InnerTerrainMod with very thorough tests (check pre/post), then try
and refactor.
Delve goal established pattern for picking up existing terrin mods.
Add additional parallel mechanism for picking up areas.
Use areas and mods a whole load more for construction projects.
Returning the entities will be vastly more useful, so do that.
CommPythonClient should probably execute python in dispath rather than read()
Rename ArithmeticScript as Arithmetic
Inheritance::isTypeOf(TypeNode) can have a tighter loop
What are we doing with spawns?
Set location
Restrict classes
Setup inventory
Filter and modify character names.
Implement a null Atlas::Bridge which just does nothing.
Note that the SystemAccount will probably cause problems during character
creation, as the system will try and persist characters, and referential
integretiy will be bad, as the account itself is not persisted.
Make cycmd stop dumping all ops to output unless monitoring is on,
and stop it re-writing the prompt so much.
cyclient - add interactive
- add args on commandline
Constrain movement if not directly in a movement domain.
Tower defense game.
Use PGconnectStart for async db stuff.
Internal "perceptive" property, which stores a set of currently visible IDs,
and can be used to send appearance/disappearance ops. Should cut down to cost
but increase storage.
A Dungeon Master like play style, where lots of minions are available to
dig and build dungeons, which a classic dungeon crawl mechanic for heros
in the Diablo style.
We really need to expose mind state better.
Add functionality to handle ids in blocks or ranges.
Does _anyone_ use Atlas::Objects iterators?
EntityFactory::m_children is only used in updating children properties, and
probably could be done by look up the children in Inheritance.
Separate the rulesets loading code out of EntityBuilder, making EntityBuilder
vastly simpler. Remove unused headers from EnittyBuilder and Ruleset.
It makes increasing sense to make the python subsystem behave a little
differently in the client:
1) Allow all operation types in client, but error on unknown in server.
2) Redirect Python output via logging mechanism in server, but not in client.
Needs to be done to make things sane.
FOO_NO numbers for operation classes are currently initialised to zero,
meaning they get missed in valgrind tests for non-initialised data.
Remove the initialisation and see what happens with valgrind now.
Minds which are asleep currently ignore all updates. This is a bit mad,
as it means we waste storage on what is inevitably going to be an outdated
world view. Either keep it updated, or just purge it completely.
Use a hidden property giving a list of worker IDs to establish common
state with tasks.
It might be useful to expose task attributes so they can be modified by
the task script itself, and ensure this propagates immediately back to
the client UI.
Add a single function for handling all those mind ops which just need
TO setting.
Check all Python for InstanceType, as that is what C++ objects used to be,
but not any more.
Client bindings don't belong in server module, and server module should
not be available at all in the client bindings.
Look into loudmouth for XMPP stuff.
Fix Arithmetic and Mind code so the factory is not created every time,
nor the type looked up every time. Python related factories need to be way
more consistent.
Look through dynamic casts and consider when it would be cleaner to
extend the interface in the base class.
Go through Python types sorting out where tp_methods can be used.
Sort out weak references for Entity and related wrappers,
Move Location into server, and isLocation somwhere else.
Many types have their own tp_new, but could be using _GenericNew.
Mind interface is pretty simple, so it should be possible to have a hive or
herd mind at either core or python layer. One significant goal will be to
eliminate the copy of the world per individual, but this is being done
already. It will probably e a major bonus to have a single view of the
world from all the entities, so that if one entity has seen something, they
are all considered to have seen it implicitly. In order for many things to
work these still need to make their own decissions though there is
collectivism to their movement decisions.
Touched on before, but why not break down clustering by the kind of computation,
so the physics layer is separated, and can only be talked to by RPC?
Another idea - separate the frontend with it's checks and socket handling
from the worldprocessing code. Connection, Account, Lobby etc would all be
handled in a frontend server with multiple processes. They share one listen
socket, and use herd of elephents prevention to listen to sockets. The then
send operations to a backend server which has the world processing.
WorldTime and DateTime need to be purely data driven
Implement connection limits.
Ensure that distance functions mark results as invalid if there
is a broken entity hierarchy.
Ways to hold territory:
NPC manned towner foritifications. No door or ladder at ground level.
Must be frequently re-supplied.
Define class properties that generate a random instance value per entity.
This is another type which must be added to every instance, and can never
be used as a default.
Look up launchd.plist man page for details of how to manage a unix daemon
under OS-X.
http://developer.apple.com/technotes/tn2005/tn2083.html
Add daily option to the create_release file, and work out where the hell to
put them.
--conf=<file> for specifying config. Simple.
Add a class for the movement domain which is a property of the movement
parent. Point to it from the Motion object. (safe reference).
Encapsulate most data related to movement in Motion rather than leaving
it to clog up Location.
Fix up cycmd to work more like cydb.
Move account update functionality into AccountBase. Keep cypasswd as the
user facing tool.
Look up using ares for asynch DNS. Possibly is skstream once that
does other stuff.
Look up Proactor pattern, Bloom filter.
How to support phasing? (Instancing so that the same place changes
fundamentally only to a subset of players)
Paxos algorithm for consensus (master election) in an unreliable distributed
system.
Modify metaserver to allow DNS queries.
Strip out the hierarchical movements domains. Flat!
The movement domain then handles collisions and line of sight
checking.
Areas of world with an associated in-game chat channel.
Connection, Master and Peer (and implicitly TrustedConnection) have members
in common, and could probably stand to inherit from a common parent.
Connection would make sense as the parent, moving stuff related to being
connected to a client to a child class UserConnection.
Add a way to extend the terrain base on where someone is walking.
Probably should sit on top of a general mechanism for modifying the
world based on player activity.
Fix out type updates in Eris. Need to be picked up in the special place
where serverinfo updates are picked up no.
Python console will make everything so much more introspective.
Remove the implicit bbox. Replace with coding the bbox property to set up
the visibility metric when applied.
OpQueEntry could be a conventional C style queue. Would be more efficient as
we are searching by hand already.
As noted before, ArithmeticFactory ScriptFactory and TaskFactory contain
much common code. Use inheritance.
Move the functionality from Statistics into StatisticsProperty, getting
rid of the class completely. Make it the simplest possible interface for the
python script, then see if this can be generalised for more broadly
applicable stuff. Python properties?
Allow generic simulated entities which have a real ID, but are not yet in
the world. The server will track them for you, and control varies depending
on privs. e.g. admin can create arbitrary simulated entities, and then insert
them for real. simulated is a bad term because in fact the difference is that
they are _NOT_ simulated.
seq is not restored.
Properties added by requirePropertyClass and perhaps related functions
are not getting installed or applied.
Currently properties are being installed early before all Entity IDs have been
restored. Need to delay. This will be a problem if there are Entity properties
around linking things together by pointers.
Make operations that depend on newId generation failable, so that a
database issue does not cause an assertion to fail.
Make sure property names are limited to 32, and also class names to the same
length. Make this 32 limit a compile time constant. Also check ruleset name
length.
Fix abort() in newId() when Database connection is down. Probably best done
with an ID pool.
Make non-value related members of a TerrainModProperty mutable, so
they can be modified without having to get a non-const pointer.
modProperty should handle setting the flag_unsent flag on properties.
Central Knowledge, available to all NPCs without being taught.
Add SIGINT handler to cycmd to cancel tasks.
Doxygen TODO lists!
All the in-place property mods are not handling apply()
Should this be done in Update()?
updateOperation could handle setting clearing the per_clean flag, the
entity_clean flag, and apply the properties.
add_map really has no code in it
update_map contains very little and is probably obsolete as it never gets
called
Review hooks and see if they really are needed.
Note that:
in sight_create_operation all that is being checked for is if we created it
If we did create it, this is going to be a special interest to any mind
so we could look at supporting it in the core base class.
in sight_move_operation we are looking for changes to the inventory
and taking ownership. Could this again be supported in the base code?
Both sight_move and sight_create update the map via the Python API
when this could be more efficiently done in the C++ if the op
handler wasn't overridden. Why not assume the python handler does not
override?
The overall concept of overriding from scripts and also from handlers
probably needs to be looked at.
Num property to implement stuff. Only works if it is installed as a class
property, otherwise does nothing. (Resets to one).
Value of one means nothing is sent.
Installing class causes instance property to be placed, but install is
not called on it.
Purge stackable.
Fix the stamina property, currently commented out.
Clear set ops out of tasks (in Character) and combat.
Can probably get rid of the hard Task pointer while at it.
In Plant.cpp a lot of properties are directly updated. Need to review
whether apply() and install have to be called on them.
Add an entity flag to indicate that the entity has been modified in
the python API, and on returning to core context an update needs to
be triggered.
Move requireSpecificProperty() and have it check on the defaults for
a default value.
Update Thing::updateProperties so it checks all properities to see whether
they've been written to the database. May need to trigger a database update.
Re-work the python wrappers to handle generating the necessary update flags
when modifying an IG entity. Complete different from the wrapper behavior
in the mind, which should probably no implement setattr at all.
It may need to generate Update or perhaps even Set operations as necessary.
Use a property flag for removing properties.
Fix up OutfitProperty to work with the modified API and conventions.
It can't really be a class property as it has entity refs, so I guess
it must be instance only. install() might like TerrainModPropery()
detect the case of a class version, and ensure that it is added as
an instance property.
Cutting down simulation cost when nothing is watching.
Gorgious. Send out a ping, and get back an estimate. at the simplest level
the simulation can continue, but decline to send out update ops. Kick off
an update in response to any subsequent look ops. Seq is being incremented
so Appearance will tell minds they need an update.
Make the overall movement model configurable. If a flat world is all that is
needed, there is no need to add more. In a fantasy MMO there is probably very
little need for more. There is a strong link here between this and the need
for persistence. If we only need character persistence, we can't really deal
with them having something other than the world as their LOC.
Define an operation which went sent returns the count of entities which
can see something, so we can suspend simulation.
If properties are responsible for their own serialisation, the represations
can be much more efficient.
Re-enable mapping of character to account.
Design a way to make only the starting POS and ORIENATION of an entity
storable.
Sort out enable_persitence. Purge the old code.
TerrainModProperty needs state, so it must be an instance property.
This can be handled in ::instal() once class properties are flagged.
Use database to allow characters to go offline.
Location is stil adding bbox data to RootEntity or MapType representations.
Stop, as this should be handled by the property.
Make sure all the places properties are set use one single way to do
it, ensuring the right calls get made to set it up.
Some entities (Character) may end up updating a class property and
then we get an error when the Update op arrives for an undiscovered
property. This also corrupts the class.
requireSpecificProperty installs new properties. Need to make sure it does
it correctly.
Think carefully about what happens when EntityBuilder::installFactory
calls Inheritance::addChild. If add child returns NULL, there
was something wrong with the factory installation and it should fail.
isSimple() and isSolid() should be entity flags, once the collision
stuff is sorted.
Modify client code which inherits from Entity so it uses LocatedEntity
or summink instead, removing the need for ClientPropertyManager.
Fix the insert properry count. Incremented in the wrong place.
Use return value of Property::get to ensure we are not storing
worthless data in the properties table.
Check use of the property manager in Character when adding status property.
Implement flag_class in EntityBuilder.
Once things are sorted for the new property mechanism, with install and apply
implemented,
insertEntity and updateEntity are returning the bool result of scheduleCommand
incorrectly.
Perhaps we can use property flags for Update ops, rather then the cludgy
going through strings?
Remove assertion from CorePropertyManager that a property called objtype
can't be created.
Implement transient to avoid Database traffic.
Make sure the select fallback code handles congested and busy ok.
Sort out http connection with a configurable port.
Make it so classes inherit python scripts, now that the factory is independant
of atlas type name.
Need a property flag to indicate that it is new, rather than just dirty.
Make update interval has jitter on it, so we don't get spikey load.
Types should have integer IDs. Bootstrap type queries with well know IDs for basic types.
Admin Creator avatatar gets destroyed once it is no longer connected, but
it then calls Connection::removeObject() despite the Connection being
long gone.
Use a broadcast cost heuristic to determine how often movement updates should
done for an entity.
Migrate everything out of BaseEntity until nothing remains, at which point
rename it to IdentifiedRouter or something like that, inheriting from
Identified. LocatedEnity should eventually not inherit from it.
rename removePlayer to something more suitable.
Once defaults work, handle pulling from defaults in the SpecificProperty
templates.
Fix the issue of leaked sigc++ connections, as connections to tool.containered
are added, but never disconnected.
Fix the rest of defaults on the TypeNode.
Use onFoo() methods to implement some of the signals we expect.
Quaternion and BBox need to be more like Vector3D and Point3D, and all 4 should
really be in physics.
In a compound object, that contains sub-objects, COMPONENTS can be like
CONTAINS, but COMPONENTS do not have a separate existence. They are destroyed
if the entity is destroyed, and do not have globally addressable IDs.
They can still be represented by Entity, but won't be in the global ID
dictionary. This leads to the idea of a component property interface whcih
abstracts looking up component IDs. An accompanying stamp can reduce the
frequency with which clients need to inspect the components, as they should
change very infrequently.
SEQ is not being used in the memmap code, as it is not being set.
Re-write plant using properties when we can write scripts for property
handlers.
Character::m_rightHandWield needs to stop being hard coded. Should
be really easy to do. Make it a dynamic property always, add install
it as required.
B&W style village construction. Nursery, plus schools for training.
Re-factor abstract factories to be called Kits, and high level factories that
assemble arrangements of objects as Builders. Concrete factories can then
use the suffix factory.
Put locks around writing the user config file.
Move bbox out of Location, and make it a soft property only.
Add instance configuration support to tools and clients.
Add setting for config file.
openID, libopkele
echo -n 'username:phpMyID:password' | openssl md5
Separate functionality for removing from container, and adding to new
container.
Modify security in NPCMind so we can do the goals without broadcasting the
talk ops. Use the TO on the Talk op to determine if this is an admin op,
so that clients can redirect ops easily. Need to verify that checking
Sound.FROM is the only reason interlinguish functions need the op. It
may be possible to get rid of passing in orignal_op completely.
New Atlas-C++ has no inheritance tree, just one class in Objects. Instead
it has function to create the instances, which create the defaults object
if required, pass it in, and return a smartptr to an instance from the pool.
Convenience versions of these function could take op arguments for operations,
or IDs or the like for entities.
Activations should use type nodes perhaps.
Check if SECONDS is set before using it? All ops in basemind should do this.
Add an argument to Location::addToEntity which specifies which need to be
set as zero values of they are not set. This should make it easier to
deal with the concept of POSless entities, and perhaps entities without
velocity. Would be nice to get rid of any situation where something has
zero velocity, as this is annoying to have to check for.
Fix new PythonArithmeticScript() from being leaked. ArithmeticFactory(124)
Shader surfaces are being leaked from TerrainProperty::set(130)
Switch over to using Atlas::Objects as the fundamental unit in the objects
code. Needs AtlasFileLoader to be converted over. This is the best first step
before we have a type tree. Done. Now get rules loading from the Database once
more, as the database code insists on MapType. Could we store the attribute
defaults in the Atlas default type thingy? Would this cause problems?
So, when we are creating a Atlas::Objects::Anonymous instances, need to
be able to set up the default object so it just works. A barrier to this being
really useful is the way Atlas-C++ currently handles defaults. It does not send
them at all. Need to modify so it sends them if they have been flagged on
the defaults object. Default to not flagging, and then modify sending behavoir.
Think about using an inherited interface to prevent calling getName()
which might cause a crash.
Core cyphesis daemon is very simple and robust. Never crashes. It launches
and monitors and number of child daemons. Simplest configuration is a single
child daemon. It reads and parses the config mostly for checking purposes.
Write common infrastructure which can check the contents of the config
for errant values, and report them. Use the current help data structures.
There should in the eventual configuration be one watcher daemon, one
simulation daemon, one persistor daemon, and one spatial processing daemon per
CPU. Simulation should be network bound, peristence should be disk bound, and
spatial should be CPU bound.
Experiment with factory base classes. Can we have a base class for BaseEntity,
inherit from it overriding with a function that returns Entity.
Datagram classes in skstream, Address classes in skstream. Datagram can be
sent to an address, without re-encoding. Datagram can be treated as stream.
Address can encapsulate getaddrinfo results, or stand alone endpoints.
There need to be two different filters on movement. The first pass should
determine what is possible given the desired input. The second should
determine side effects of the movement. Can we really separate them, given
that the side effects modify the effort and possibility of the movement?
Blocking movement thingies are going to have to go. Handling move ops should
just schedule the move. We pass to some collision subsystem, and then send
the result once the result it back.
Make IGEntityExerciser succeed in stimulating the Create op.
Make IGEntityExerciser succeed in stimulating the Move op.
Create a simple class that fully encapsulates having a python script in
a general way, which can then be used by entity, task, statistics etc.
EntityFactory has got really convoluted. Try and verify that the same things
are done when a tool is updated as when it is loaded. May be good to break
things down into smaller functions.
script_factory->refreshClass is called before populateFactory(). Seems weird.
Surely the script might have been changed? If it has, what causes it to be
loaded?
Fill out auto activation op stuff. Now that operations is automatic,
need to ensure children inherit the behavior as well as the value, which
requires some work on the activations.
In EntityFactory, we should abort a task install if the target does not exist.
Add unit tests to make sure rule install order with multiple dependencies
is okay.
Write a task to beat down fire with shovel.
Specify contents of the house in the class rule, rather than using the script
to create it. Contained entity data format again, just like blueprint.
CONSTITUANTS?
Add a transient property which indicates that something does not last, and
should not be persisted. This would allow most of the seed scripts to be
removed.
There is a chance something could get screwed up in waitingRules.
If something depends on two classes, and the second is not present the first
time it fires, m_waitingRules will get modified mid iteration, and then
the waiting item will get removed despite the fact that is has not been
installed.
When a task cannot be installed because of pre-reqs, record the error so
it can be reported.
Push to remove the world class, making it all more driven by data behavior.
POS can't change in Dig and Delve, so make them irrelevant if its not the right
kind of terrain.
Add range check to Dig and Delve, and see if it can be done more generally.
Re-write goals for butcher so they now interact correctly with the task
implementation.
GetOp is not part of IG, so illustrates for OOG dispatch to be different from
IG.
Apply behavior to newly created skellys. Now that the mind classes have been
removed, skeletons need goals to do anything.
Implement blocking rules until all associated rules can be verified so
tasks can't get installed without their activation ops and classes existing.
self.progress seems to start out at -2 in Slice. Uninitialised?
Add a way to handle per-host config in a single config file.
Fix parameter lookup in varconf.
Add a call to Atlas-C++ which takes a bit field of attribute bits, and returns
a bitfield of attribute bits that was requested but not present. Reduces
error checking complexity loads.
Pig seller seems to assume he is being given coins when actually they
are being handed round by other people.
Look up in Python Nutshell and read up on ref-counting + exceptions. Read
whole section on embedding.
ServerRouting owns accounts currently, so have it encapsulate the whole
database thing. Check if the findAccount test is a good reason not to do
this.
metaserver needs to reinitialise if bind is lost.
Make sure autopackage uses /var/tmp rather than PREFIX/var/tmp
Instrument BaseMind/MemMap to detect mutiple additions of the same thing
to the same mind.
Make it easier to use cypasswd to elevate privs.
Add ability to create other types of avatar.
Investigate -static-libgcc for partially static version of binaries for
distribution.
autopackage should start server
Set up python environment during test, so they import from the source tree.
Find out why locks up when it can't load ruleset.
Add a new kind of programmable mind, for babysitting player characters.
Provide python access to the game config.
Prevent soft attributes being set with the names of known properties.
Set name from client.
Setting attributes needs to be re-done more complex. Reporting divided
into scopes, and reporting done based on what really happened, not what
the Set wanted to happen.
Move the stuff that generates vast quantity of test Atlas data into
its own class, so other things can use it.
Complete the work on property exercising tests.
Fix python code which uses PyMem_DEL to use PyObject_Del which is the
right thing now.
Minds are getting properties from the core factory, because it is now accessed
as a singleton. This cannot stand.
Add a humanoid base class, putting default character bbox and the like in
there, plus decays="skull".
If I attach a property that listens out for delete ops, and creates things,
do the returned ops still work okay? Ie does the deleted entity stick
around long enough for the operation to get dispatched, even though it has
been removed from the world map. If so, could use this to handle creating
corpse, bones etc.
Implement some kind of helper mechanism which monitors ops going to the client
and if some match a certain template, it sends hints in the form of emotes.
Move metabolism into a property, ensuring that Character becomes a cleaner
class. Implement death better, creating a skeleton with a named skull.
Mod the lich code to use the name on the skull when creating the skeleton.
Take another look at the scheme used in mind code to purge entities
it thinks are bad.
Add an operation to account allowing the client to add a mind to its
Character. When a Character has internal and external mind, ops from the
internal mind should go only to the externalMind.
Add an option to put a python console on stdio. See PyRun_InteractiveOneFlags
to see an example of a functio which takes a line, and executes it in
the way that the interactive interpretter does.
Implement GUISE property.
Atlas::Message::Element has TYPE_NONE, so we have a conceivable way
to signal clearing of an attribute. Basically only possible soft attributes
unless we want to make the Atlas::Objects code hideous. If we are going to
find a way to signal this to the client, we need to add it to Atlas-C++.
How do we clear a Property if it is specified by Update arg, but is no
longer set to anything? Need a way for force it.
Make updateProperties read-only perhaps? Needs to clean out properties.
In GuiseProperty, need to ensure that Set operation is simply a trigger
for an update, so we can do things efficiently. A signal triggered
by destruction or container change should trigger a Set(guis={}) which
once it gets to the SetOperation handler gets its arg re-written, I guess
the only option is the complete value.
Strip most operations out of the mindFooOperation() interface, as all soft
ops now go via scripts, if at all.
Make sure all properties override correctly. Check const.
Look at PyOplist and see if it would be better to embed the object rather than
have a pointer.
Consider, can we pre-fetch and cache the python object involved in calling a
hook?
Plough field, grow veggies. Carrot turnip.
Add code to EntityPropertytest to cover setting by ID.
Can we make client connection code more generic, getting rid of the
nasty merged TCP / UNIX stuff, and sharing code between tools and client.
Perhaps even totally generic for server and client.
Add log rotation /etc/logrotate.d/foo to rpm.
Improve pig death handling. Death is effectively just removing the mind
state, so do so. Also think about disconnecting the incoming side
of external mind. Perhaps interact in some way with the movement state?
Ad physical constraints system, which if move op comes, it is filtered
or transformed by it. For example, in a structure, elements of that
structure would be contrained so that they translated move ops into
move ops of their parent entity, the structure itself. This should be
possible using the generic idea of properties that handle operations,
and gives us a use case example for how a given property might need
to filter or override an operation.
datagram notes: see skstream TODO. Idea: When a broadcast op arrives at
the Connection, route it to an object handling datagram comms for a given
set of clients, and it caches the object, and notes the target address.
It then builds a pool of target addresses for the cached op as the
op is broadcast around the clients, and then later, in the socket loop
code, it then handles sending the data out. Alternatively it could
serialise when it first gets the op, and cache the serialised data
in the stream, noting the identity of the operation so that it can
resend it. As long as it holds the operation smart pointer, no
other operation can arrive with the same address, although another one
later may easily have the same address once the smartptr releases to the
memory pool. As soon as another op arrives for transmission, it should be