$(OBJECTS) derives object paths by substituting the extension away, so
two sources under one directory whose paths differ only in extension
name the same object. Make builds it once and the first matching
pattern rule wins -- %.o: %.cpp is listed first -- so the C unit never
gets compiled and its symbols are undefined at link. Give the two
units distinct basenames.
tests/objcollide flags any object claimed by sources in more than one
language. It reports the collision and exits non-zero with the name
restored to SaveState.c, and passes as things stand.